Java 8 Streams FlatMap 方法示例

2022-08-31 11:25:47

我一直在检查即将推出的,即: .是的,我不耐烦,有很多新的东西,但是,有些东西我不明白,一些简单的代码:Java updateJava 8 or JDK 8

final Stream<Integer>stream = Stream.of(1,2,3,4,5,6,7,8,9,10);
stream.flatMap();

javadocs 是

public <R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)

返回一个流,该流由将此流的每个元素替换为通过将提供的映射函数应用于每个元素而生成的映射流的内容的结果组成。每个映射流在其内容放入此流后都将关闭。(如果映射的流为 null,则使用空流。这是一个中间操作。

如果有人创建了一些关于,如何在以前的java版本中对其进行编码以及如何使用编写相同例程的简单现实示例,我将不胜感激。flatMapJava[6,7]Java 8


答案 1

对于已经平坦的(如您在问题中显示的流)而言,这是没有意义的。flatMapStream<Integer>

但是,如果你有一个,那么这将是有意义的,你可以这样做:Stream<List<Integer>>

Stream<List<Integer>> integerListStream = Stream.of(
    Arrays.asList(1, 2), 
    Arrays.asList(3, 4), 
    Arrays.asList(5)
);

Stream<Integer> integerStream = integerListStream .flatMap(Collection::stream);
integerStream.forEach(System.out::println);

这将打印:

1
2
3
4
5

要完成Java 8之前的这个任务,你只需要一个循环:

List<List<Integer>> integerLists = Arrays.asList(
    Arrays.asList(1, 2), 
    Arrays.asList(3, 4), 
    Arrays.asList(5)
)

List<Integer> flattened = new ArrayList<>();

for (List<Integer> integerList : integerLists) {
    flattened.addAll(integerList);
}

for (Integer i : flattened) {
    System.out.println(i);
}

答案 2

编造的例子

假设您要创建以下序列:1,2,2,3,3,3,3,4,4,4,4等(换句话说:1x1,2x2,3x3等)。

它可能看起来像这样:flatMap

IntStream sequence = IntStream.rangeClosed(1, 4)
                          .flatMap(i -> IntStream.iterate(i, identity()).limit(i));
sequence.forEach(System.out::println);

哪里:

  • IntStream.rangeClosed(1, 4)创建从 1 到 4 的流(包括 1 和 4)int
  • IntStream.iterate(i, identity()).limit(i)创建长度为 i 的 i 的流 - 因此应用于它创建了一个流:inti = 44, 4, 4, 4
  • flatMap“展平”流并将其“连接”到原始流

使用 Java < 8,您需要两个嵌套循环:

List<Integer> list = new ArrayList<>();
for (int i = 1; i <= 4; i++) {
    for (int j = 0; j < i; j++) {
        list.add(i);
    }
}

真实世界示例

假设我有一个,其中每个本质上都是一个.我想获取至少一个时间序列具有值的所有日期的列表。 救援:List<TimeSeries>TimeSeriesMap<LocalDate, Double>flatMap

list.stream().parallel()
    .flatMap(ts -> ts.dates().stream()) // for each TS, stream dates and flatmap
    .distinct()                         // remove duplicates
    .sorted()                           // sort ascending
    .collect(toList());

它不仅可读,而且如果您突然需要处理100k个元素,只需添加即可提高性能,而无需编写任何并发代码。parallel()


推荐