stream中flatmap
时间: 2025-02-16 20:58:34 浏览: 44
### Java Stream `flatMap` 方法详解
#### 什么是 `flatMap`
`flatMap` 是一种用于处理流的操作,它接受一个函数作为参数,并将流中的每个元素转换成一个新的流,然后把这些新产生的子流合并成一个单一的流。这使得可以方便地对复杂的数据结构进行扁平化操作[^1]。
```java
@Test
public void testFlatMap() {
List<Integer> result = Stream.of(Arrays.asList(1, 2), Arrays.asList(3, 4))
.flatMap(Collection::stream)
.map(i -> i + 1)
.collect(Collectors.toList());
assertEquals(Arrays.asList(2, 3, 4, 5), result);
}
```
这段代码展示了如何利用 `flatMap` 将嵌套列表转化为单层列表并对其执行进一步变换操作。这里先通过 `Collection::stream` 把内部的每一个集合转成了独立的流对象,再由 `flatMap` 负责把它们全部展开了来形成最终的结果集。
#### 使用场景
当面对多级嵌套数据结构时,比如列表内含有的还是其他类型的容器(如另一个列表),此时就可以借助于 `flatMap` 来简化这些层次关系,从而更容易地遍历整个数据集。此外,在某些情况下,可能还需要结合过滤器或其他中间操作符一起工作以满足特定需求。
#### 实际应用案例
考虑这样一个实际应用场景——电子商务平台上的订单处理系统可能会接收到一批顾客购买记录组成的批量请求;每条记录都包含了多个商品项的信息。如果想要统计这批订单里所有不同种类的商品数量,则可以通过如下方式实现:
```java
// 假设 Order 类有一个 getItems() 返回 Item 列表的方法
List<Order> orders = ... ; // 获取到所有的订单列表
long distinctItemCount = orders.stream()
.flatMap(order -> order.getItems().stream())
.distinct()
.count();
System.out.println("Total number of unique items across all orders: " + distinctItemCount);
```
在这个例子中,`orders.stream()` 创建了一个基于订单序列的流实例,接着调用了 `flatMap` 对其中每一笔交易里的项目进行了展开,最后计算出了不重复的产品总数目。
阅读全文
相关推荐


















