1. 功能区别
- map方法:对Stream中的每个元素应用一个函数,将其映射成一个新的元素,生成一个新的Stream,新Stream的元素个数与原Stream相同。
- flatMap方法:对Stream中的每个元素应用一个函数,该函数返回一个Stream,然后将这些Stream扁平化为一个新的Stream,新Stream的元素个数可能与原Stream不同。
2. 处理数据结构区别
- map方法:适用于处理单个元素,不改变数据结构的维度。例如,将一个包含字符串的Stream中的每个字符串转换为其长度,新Stream依然是一维的。
- flatMap方法:常用于处理嵌套的数据结构,比如一个包含多个List的Stream,通过flatMap可以将其扁平化为一个包含所有List元素的一维Stream。
3. 应用场景区别
- map方法:当需要对Stream中的每个元素进行简单转换,且不改变数据结构的层次时使用。例如,将一组数字转换为它们的平方。
- flatMap方法:当需要处理嵌套结构的数据,将其扁平化时使用。比如,将一个包含多个单词列表的Stream,合并为一个包含所有单词的Stream。
4. 代码示例
map方法示例
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class MapExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squaredNumbers = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
System.out.println(squaredNumbers);
}
}
flatMap方法示例
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FlatMapExample {
public static void main(String[] args) {
List<List<String>> lists = Arrays.asList(
Arrays.asList("a", "b"),
Arrays.asList("c", "d"),
Arrays.asList("e", "f")
);
List<String> flatList = lists.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
System.out.println(flatList);
}
}