Java Stream API 之 flatMap
flatMap
是 Java Stream API 中一个非常实用的操作,但它对新手来说可能有点抽象。我会通过一个简单的生活场景和代码示例来让小白理解它。
生活场景类比
假设你有一个“大盒子”,里面装着多个“小盒子”,每个小盒子里有一些水果。现在你想把所有小盒子里的水果合并到一个大篮子里。这时候 flatMap
的作用就是:拆开每个小盒子,把里面的水果全部倒进大篮子。
代码演示
1. 简单示例:扁平化嵌套列表
假设有一个嵌套的列表结构,我们想将所有元素合并成一个“平面”列表:
List<List<Integer>> nestedList = Arrays.asList(
Arrays.asList(1, 2, 3),
Arrays.asList(4, 5),
Arrays.asList(6)
);
// 使用 flatMap 将所有子列表合并成一个流
List<Integer> flatList = nestedList.stream()
.flatMap(list -> list.stream()) // 将每个子列表转为流,并合并
.collect(Collectors.toList());
System.out.println(flatList); // 输出 [1, 2, 3, 4, 5, 6]
解释:
-
flatMap
的作用:将每个子列表(如[1,2,3]
)转换为一个独立的流(Stream<Integer>
),然后将所有流合并成一个总流。 -
如果没有
flatMap
,直接使用map
,会得到Stream<Stream<Integer>>
,而不是合并后的结果。
2. 实际场景:订单中的商品
假设你有一个订单列表,每个订单包含多个商品。现在要提取所有订单中的所有商品:
class Order {
private List<String> products;
public Order(List<String> products) {
this.products = products;
}
public List<String> getProducts() {
return products;
}
}
// 创建订单列表
List<Order> orders = Arrays.asList(
new Order(Arrays.asList("苹果", "香蕉")),
new Order(Arrays.asList("西瓜", "葡萄")),
new Order(Arrays.asList("橙子"))
);
// 提取所有商品
List<String> allProducts = orders.stream()
.flatMap(order -> order.getProducts().stream()) // 将每个订单的商品转为流,合并
.collect(Collectors.toList());
System.out.println(allProducts); // 输出 [苹果, 香蕉, 西瓜, 葡萄, 橙子]
3. 更复杂示例:拆分句子中的单词
假设有一个句子列表,需要将所有单词拆分并去重:
List<String> sentences = Arrays.asList(
"Hello World",
"Java Stream API",
"flatMap example"
);
// 拆分所有单词并去重
List<String> words = sentences.stream()
.flatMap(sentence -> Arrays.stream(sentence.split(" "))) // 将每个句子拆分为单词流
.distinct() // 去重
.collect(Collectors.toList());
System.out.println(words); // 输出 [Hello, World, Java, Stream, API, flatMap, example]
flatMap
vs map
-
map
:一对一转换(例如将数字转为字符串)。Stream.of(1, 2, 3).map(n -> n * 2); // 结果 [2, 4, 6]
-
flatMap
:一对多转换,并合并结果(例如将列表的列表合并为单个列表)。Stream.of(Arrays.asList(1,2), Arrays.asList(3,4)) .flatMap(list -> list.stream()); // 结果 [1, 2, 3, 4]
总结
-
flatMap
的核心作用:将嵌套结构“扁平化”,合并多个流为一个流。 -
适用场景:
-
处理嵌套集合(如
List<List<T>>
)。 -
分解元素(如拆分句子中的单词)。
-
合并多个数据源的结果。
-
通过这种方式,flatMap
让复杂的数据处理变得简洁清晰! 🚀