📜  Java Stream 中 map() 和 flatMap() 的区别(1)

📅  最后修改于: 2023-12-03 14:42:16.290000             🧑  作者: Mango

Java Streammap()flatMap() 的区别

Java 8 中,Stream 提供了 map()flatMap() 这两个用于对 Stream 中的元素进行操作的方法。虽然这两者的名字相似,但是它们的用法和功能有很大的差别。

map()

map() 方法接收一个 Function 做为参数,该 Function 将会应用到 Stream 中的每一个元素上。它返回一个新的 Stream 对象,该对象包含了将该 Function 应用到原始 Stream 中所有元素后生成的结果。

下面是一个简单的使用 map()Stream 中每一个元素应用 toUpperCase() 方法的示例:

List<String> words = Arrays.asList("hello", "world");
List<String> capitalizedWords = words.stream()
                .map(String::toUpperCase)
                .collect(Collectors.toList());
System.out.println(capitalizedWords); // 输出 [HELLO, WORLD]

在上面的示例中,map() 方法将 toUpperCase() 应用到了 Stream 中的每一个元素上,返回了一个包含了所有大写单词的新 Stream

flatMap()

flatMap() 方法也接收一个 Function 做为参数,该 Function 将会应用到 Stream 中的每一个元素上,但是该 Function 的返回值是一个 Stream 对象。flatMap() 方法会将所有生成的 Stream 里的元素组合到一个新的 Stream 中。

下面是一个简单的使用 flatMap() 将多个 List 合并成一个 Stream 的示例:

List<List<String>> wordLists = Arrays.asList(
        Arrays.asList("hello"),
        Arrays.asList("world", "from"),
        Arrays.asList("Java", "Stream")
);
List<String> words = wordLists.stream()
                .flatMap(List::stream)
                .collect(Collectors.toList());
System.out.println(words); // 输出 [hello, world, from, Java, Stream]

上面的示例中,flatMap() 方法将多个 List 中的元素合并到一个新的 Stream 中,并返回了包含了所有单词的新 Stream

总结

简单来说,map() 方法用于将原始 Stream 中的每一个元素进行转换,返回一个新的 Stream。而 flatMap() 方法则是将原始 Stream 中的每一个元素进行转换,并将返回的多个 Stream 合并到一个新的 Stream 中。