java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Stream流中的Map与flatMap区别

Stream流中的Map与flatMap的区别及说明

作者:night_gu

Map转换单个元素为新值,保持流长度;flatMap将元素转换为流再合并,实现扁平化处理,两者区别在于返回类型(对象vs流)及是否改变元素数量,适用于不同数据结构转换场景

Map与flatMap的基本概念

Map用于将流中的每个元素通过指定函数转换为另一个元素,生成一个一对一映射的新流。

例如将字符串流转换为对应长度流:

List<String> words = Arrays.asList("a", "bb", "ccc");
List<Integer> lengths = words.stream()
                             .map(String::length)
                             .collect(Collectors.toList()); 
// 输出: [1, 2, 3]

flatMap用于将每个元素转换为流后合并所有流,形成一对多映射的扁平化结果。

例如拆分字符串中的单词:

List<String> lines = Arrays.asList("hello world", "java stream");
List<String> words = lines.stream()
                          .flatMap(line -> Arrays.stream(line.split(" ")))
                          .collect(Collectors.toList());
// 输出: ["hello", "world", "java", "stream"]

核心区别对比

Map保持原始流元素数量不变,flatMap可能改变元素数量(如拆分为多个子流后合并)

Map的Function返回普通对象,flatMap的Function必须返回Stream对象

Map适合单一元素转换,flatMap适合处理嵌套集合(如List<List>)

典型应用场景

Map适用场景

数据类型转换(String→Integer)、属性提取(对象→ID)、简单计算(数值→平方值)

flatMap适用场景

性能注意事项

flatMap涉及流合并操作,可能产生更多临时对象。

对于简单转换优先使用map,多层嵌套数据结构才使用flatMap。

代码示例对比

处理书籍作者场景:

// 使用map(保留嵌套结构)
List<Book> books = ...;
List<List<String>> authors = books.stream()
                                 .map(Book::getAuthors)
                                 .collect(Collectors.toList());

// 使用flatMap(扁平化结构)
List<String> allAuthors = books.stream()
                              .flatMap(book -> book.getAuthors().stream())
                              .collect(Collectors.toList());

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文