繁体   English   中英

在java 8中合并具有不同类型和长度的多个流

[英]Merging multiple streams in java 8 with different types and length

如何在java 8中合并具有不同类型和长度的多个流

Stream<String> x = Stream.of("A", "B", "C");
Stream<Integer> y = Stream.of(3, 7);
Stream<Float> z = Stream.of(1.1f, 2.2f);

预期的结果是一个包含如下内容的蒸汽:

A 3 1.1f
A 3 2.2f
A 7 1.1f
A 7 2.2f
B 3 1.1f
B 3 2.2f
B 7 1.1f
B 7 2.2f
C 3 1.1f
C 3 2.2f
C 7 1.1f
C 7 2.2f

您必须定义一些包含这 3 个属性的类。 我们称之为Triplet

但是由于我们必须多次流式传输某些数据源,因此最好从List开始,而不是Stream

List<String> x = List.of("A", "B", "C");
List<Integer> y = List.of(3, 7);
List<Float> z = List.of(1.1f, 2.2f);

(如果必须从Stream开始,则必须首先将第二个和第三个Stream收集到List )。

现在你可以写:

Stream<Triplet> triplets =
    x.stream()
     .flatMap(a -> y.stream()
                    .flatMap (b -> z.stream()
                                    .map(c -> new Triplet(a,b,c))));

如果您愿意,您可以使Triplet类通用(然后生成Stream<Triplet<String,Integer,Float>> )。

由于最初的问题使用流作为输入并且这些流不可重用,我想添加我的版本,将第二个和第三个流转换为列表(列表创建的性能损失)。 如果性能是一个问题,那么最好首先将至少两个流作为列表。

此外,如果您想使用org.apache.commons:commons-lang3:3.9库,您可以使用 Triple 类来保存结果。

    List<Integer> yList = y.collect(Collectors.toList());
    List<Float> zList = z.collect(Collectors.toList());
    Stream<Triple<String, Integer, Float>> newStream =
            x.flatMap(a -> yList.stream()
                    .flatMap (b -> zList.stream()
                            .map(c -> Triple.of(a, b, c))));
    newStream.forEach(System.out::println);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM