在Java Stream API中,flatMap()map()都是用于对流中的元素进行转换操作的方法,但它们在处理方式上有一些区别。

map()方法用于将流中的每个元素映射到另一个值。它接受一个函数作为参数,该函数定义了将输入元素转换为输出元素的逻辑。map()方法的输出流与输入流的元素个数相同。

例如,假设我们有一个整数流,我们希望将每个整数都乘以2。可以使用map()方法来实现这一转换:

1
2
3
4
5
6
7
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> doubledNumbers = numbers.stream()
.map(n -> n * 2)
.collect(Collectors.toList());

// 输出:[2, 4, 6, 8, 10]
System.out.println(doubledNumbers);

flatMap()方法与map()方法类似,但是它的输出流不再是一个元素的流,而是将每个元素转换为流的内容,然后将这些流扁平化为单个流。换句话说,它将嵌套的流结构展开。

通常,在处理嵌套集合或处理一对多关系的场景下,flatMap()方法非常有用。

例如,假设我们有一个包含多个单词的字符串列表,我们想要获取所有的不重复单词列表。可以使用flatMap()方法将每个字符串拆分为单词,并将所有的单词扁平化为一个流,然后通过distinct()方法去除重复的单词:

1
2
3
4
5
6
7
8
List<String> words = Arrays.asList("Hello", "World");
List<String> uniqueWords = words.stream()
.flatMap(str -> Arrays.stream(str.split("")))
.distinct()
.collect(Collectors.toList());

// 输出:[H, e, l, o, W, r, d]
System.out.println(uniqueWords);

总结一下,map()方法将每个元素映射为另一个值,而flatMap()方法将每个元素映射为流,并将这些流扁平化为一个流。这些方法的选择取决于你对数据结构的需求和转换逻辑。