flatMap
是 Java 8 中引入的一个新特性,它属于 java.util.stream
包。flatMap
是一个终端操作,用于将多个流合并为一个流,并将每个流中的元素转换为另一种形式的元素。flatMap
的主要作用是将嵌套的流结构扁平化为一个流结构。
以下是 flatMap
与其他映射方法(如 map
和 filter
)的区别:
map
:map
是一个中间操作,它将流中的每个元素转换为另一种形式的元素。map
不会改变流的结构,只是对每个元素进行转换。例如,你可以使用 map
将整数流转换为它们的平方值流。List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> squaredNumbers = numbers.stream().map(x -> x * x);
filter
:filter
也是一个中间操作,它根据给定的谓词(即布尔函数)从流中筛选出满足条件的元素。filter
不会改变流的结构,只是对元素进行筛选。例如,你可以使用 filter
从整数流中筛选出偶数。List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> evenNumbers = numbers.stream().filter(x -> x % 2 == 0);
flatMap
:flatMap
是一个终端操作,它将多个流合并为一个流,并将每个流中的元素转换为另一种形式的元素。flatMap
会改变流的结构,因为它将嵌套的流结构扁平化为一个流结构。例如,你可以使用 flatMap
将嵌套的整数列表流扁平化为一个整数流。List<List<Integer>> nestedLists = Arrays.asList(
Arrays.asList(1, 2, 3),
Arrays.asList(4, 5, 6),
Arrays.asList(7, 8, 9)
);
Stream<Integer> flattenedStream = nestedLists.stream().flatMap(list -> list.stream());
总结一下,map
和 filter
是中间操作,它们不会改变流的结构,只是对元素进行转换和筛选。而 flatMap
是一个终端操作,它会改变流的结构,将嵌套的流结构扁平化为一个流结构。