流我只用来过滤,分组,处理集合转换等等,涉及复杂业务逻辑都是用for循环写清楚。没毛病吧! <!-- more --> ```mermaid graph TB subgraph Map操作 A["Stream<String><br/>[apple, banana]("Stream<String><br/>[apple,%20banana) B["map(s -> s.length())"] C["Stream<Integer><br/>[5, 6]("Stream<Integer><br/>[5,%206) A -->|"映射转换"| B B -->|"结果"| C end subgraph FlatMap操作 D["Stream<String><br/>[hello, world]("Stream<String><br/>[hello,%20world) E["flatMap(s -> <br/>Arrays.stream(s.split('')))"] F["Stream<String><br/>[h,e,l,l,o,w,o,r,l,d]("Stream<String><br/>[h,e,l,l,o,w,o,r,l,d) D -->|"拆分并展平"| E E -->|"结果"| F end style A fill:#e1f5fe style C fill:#e1f5fe style D fill:#e1f5fe style F fill:#e1f5fe style B fill:#fff3e0 style E fill:#fff3e0 ``` ## map n -> n - 输入是一个 Stream - 对每个元素进行 1:1 的转换 - 输出仍然是一个 Stream,但元素类型可能改变 ## flatMap n -> n × m - 输入是一个 Stream - 对每个元素进行 1:n 的转换(产生多个结果) - 将所有结果合并成一个扁平的 Stream List<`Map<Integer, Integer>`> -> `Map<Integer, Integer>` | | |---| |`Map<Integer, Integer>` mergedDiscount = sellPromotions.stream() <br>.reduce(Maps.newHashMap(), (merge, map) -> { <br> map.forEach((key, value) -> merge.merge(key, value, (v1, v2) -> nullToZero(v1) + nullToZero(v2))); <br> return merge; <br> });| 这段代码是使用 Java 的 Stream API 来合并一个 `sellPromotions` 列表中的所有促销折扣信息到一个新的 `Map` 中。这个列表里的每个元素都是一个 `Map<Integer, Integer>` 类型,表示的是商品的 ID 和对应的促销折扣值。合并的逻辑是将所有这些 Map 中的键值对加入到一个新的 Map 中,如果出现相同的键(即相同的商品 ID),则将它们的值(促销折扣)相加。如果任何一个值为 `null`,则在相加之前将其视为 `0`。 让我们通过一个例子来说明这段代码的工作原理: 假设我们有以下的促销折扣列表(`sellPromotions`): - 第一个促销折扣 Map:`{1=10, 2=20}` - 第二个促销折扣 Map:`{2=5, 3=15}` 这里,`nullToZero` 是一个假设的函数,用于将 `sellPromotions`0 值转换为 `sellPromotions`1。这段代码中并没有直接展示这个函数的实现,但其功能是明确的。 现在,我们使用提供的代码片段来合并这些促销折扣: 1. 初始化一个新的 HashMap。 2. 遍历 `sellPromotions`2 列表中的每一个 Map: - 对于第一个 Map:将 `sellPromotions`3 中的键值对添加到新的 Map 中,现在新的 Map 变为 `sellPromotions`4。 - 对于第二个 Map:尝试将 `sellPromotions`5 中的键值对加入到新的 Map 中。 - 对于键 `sellPromotions`6,它在新的 Map 中已存在,因此将两个值相加:`sellPromotions`7,更新后的 Map 为 `sellPromotions`8。 - 对于键 `sellPromotions`9,它在新的 Map 中不存在,直接加入,最终 Map 为 `Map`0。 最终结果,新的 Map 包含了所有促销信息的合并,其中相同商品 ID 的促销折扣被累加。 这段代码的关键是使用 `Map`1 函数来处理键值对的合并逻辑。`Map`2 函数接受三个参数:键、要合并的值以及一个合并函数(如果键已经存在)。在这个例子中,合并函数是 `Map`3,它确保了如果有任何 `Map`4 值,它们会被当作 `Map`5 来处理,并将两个值相加。