带有示例的 Java Stream flatMap()

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(263)   2023-07-11 14:19:57

Stream flatMap() 方法用于将集合流扁平化为对象流。这些对象是从原始 Stream 中的所有集合组合而来的。

flatMap() 操作具有对 Stream 的元素应用一对多转换的效果,然后将生成的元素展平为新的 Stream

Stream.flatMap() 有助于将 Stream<Collection<T>> 转换为 Stream<T>

flatMap() = 扁平化 + map()

1.什么是扁平化?

通俗地说,扁平化指的是将多个集合/数组合并为一个。考虑以下示例。

在此示例中,我们有一个包含 3 个数组的数组。扁平化效果后,我们将得到一个结果数组,其中包含 3 个数组中的所有项目。

Before flattening 	: [[1, 2, 3], [4, 5], [6, 7, 8]]

After flattening 	: [1, 2, 3, 4, 5, 6, 7, 8]

在以下示例中,lines 是文件中的行流。每行由多个单词组成。 words 流是将所有流变成单个流的加肥版本——由所有行中的所有单词组成。

Stream<String> lines = Files.lines(path, StandardCharsets.UTF_8);

Stream<String> words = lines.flatMap(line -> Stream.of(line.split(" +")));

2. Stream flatMap() 方法

2.1.方法语法

flatMap() 方法具有以下语法。

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
  • R 表示新流的元素类型。
  • mapper 是一个无干扰、无状态的函数,适用于每个产生新值流的元素。
  • 该方法返回类型为 R 的新对象流。

Stream 接口有另外三个类似的方法,它们生成IntStreamLongStream $$$ 分别在 DoubleStream 操作之后。如果在 flatMap() 操作之后创建的流返回上述给定类型,则考虑直接使用这些函数。

IntStream flatMapToInt(Function<? super T,? extends IntStream> mapper)
LongStream flatMapToLong(Function<? super T,? extends LongStream> mapper)
DoubleStream flatMapToDouble(Function<? super T,? extends DoubleStream> mapper)

2.2.描述

  • flatMap() 是一个中间操作并返回一个新的Stream
  • 它返回一个 Stream,其中包含将给定流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果。
  • mapper 中用于转换的 flatMap() 函数是无状态函数,仅返回新值流。
  • 每个映射的 Stream 在其内容被放入新的 Stream 后关闭。
  • flatMap() 操作使流变平;与不应用扁平化的 map() 操作相反。

3. Stream flatMap()实例

示例 1:将嵌套列表转换为单个列表

Stream.flatMap() 函数的 Java 8 示例,用于获取包含列表列表中所有元素的单个 List

此程序使用 flatMap() 操作将 List<List<Integer>> 转换为 List<Integer>

List<Integer> list1 = Arrays.asList(1,2,3);
List<Integer> list2 = Arrays.asList(4,5,6);
List<Integer> list3 = Arrays.asList(7,8,9);
  
List<List<Integer>> listOfLists = Arrays.asList(list1, list2, list3);
 
List<Integer> listOfAllIntegers = listOfLists.stream()
          .flatMap(x -> x.stream())
          .collect(Collectors.toList());

System.out.println(listOfAllIntegers);

程序输出。

[1, 2, 3, 4, 5, 6, 7, 8, 9]

示例 2:将嵌套数组收集到一个列表中

Stream.flatMap() 函数的 Java 8 示例,用于获取包含数组数组中所有元素的单个 List

String[][] dataArray = new String[][]{{"a", "b"}, 
		{"c", "d"}, {"e", "f"}, {"g", "h"}};
         
List<String> listOfAllChars = Arrays.stream(dataArray)
              .flatMap(x -> Arrays.stream(x))
              .collect(Collectors.toList());

System.out.println(listOfAllChars);

程序输出。

[a, b, c, d, e, f, g, h]

将您与 Java Stream API 中的Stream flatMap() 方法 相关的问题交给我。

快乐学习!!

地址:https://www.cundage.com/article/stream-flatmap-example.html

相关阅读

Java 8 Stream.map() 将 Stream&lt;X&gtl; 转换为 Stream&lt;Y&gtl;。对于每个 X 类型的对象,都会创建一个新的 Y 类型的对象,并将其放入新的...
Stream skip(n) 方法用于从给定 Stream 中跳过第一个 'n' 元素。 skip() 方法返回一个新的 Stream,它包含原始 Stream 的剩余元素,在指定的 n 元素被...
Stream flatMap() 方法用于将集合流扁平化为对象流。这些对象是从原始 Stream 中的所有集合组合而来的。 flatMap() 操作具有对 Stream 的元素应用一对多转换的效...
学习使用 Stream.concat() 方法用于将两个流合并为一个流,该流由两个合并流的所有元素组成。 1.流concat()方法 static &lt;T&gtl; Stream&lt;T&...
学习计算 Stream 中由指定过滤器表达式传递的匹配项。统计项目,我们可以使用以下两种方法,都是终端操作,结果是一样的。 Stream.count() Stream.collect(Colle...
Java Stream anyMatch(predicate) 是终端短路操作。它用于检查 Stream 是否包含至少一个满足给定 Predicate 的元素。 1. 流 anyMatch() ...
findFirst() 方法返回一个 Optional 描述 给定流的第一个元素 如果 流 是非空的,或者如果流为空,则为空 Optional。 1.流findFirst()方法 Optiona...
findAny() 方法返回一个 Optional 描述 给定流的任何元素 如果 流 是非空的,或者如果流为空,则为空 Optional。 在非并行流中,findAny() 将在大多数情况下返回...
了解如何使用 Stream toArray() API 将 Stream 转换为数组。在本教程中,我们将看到多个示例,用于将 Stream 元素收集到 数组。 1. Stream toArray...
Java Stream allMatch() 是一个短路终端操作,用于检查流中的所有元素是否满足提供的谓词。 1.流allMatch()方法 1.1.句法 boolean allMatch(Pr...