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

在Java8中合并具有不同类型和长度的多个流,java,Java,如何在Java8中合并不同类型和长度的多个流 Stream<String> x = Stream.of("A", "B", "C"); Stream<Integer> y = Stream.of(3, 7); Stream<Float> z = Stream.of(1.1f, 2.2f); 您必须定义一些包含这3个属性的类。让我们称之为Triplet 但由于我们必须对某些数据源进行多次流式处理,因此最好从Lists开始,而不是从streams开始: List

如何在Java8中合并不同类型和长度的多个流

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

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

但由于我们必须对某些数据源进行多次流式处理,因此最好从
List
s开始,而不是从
stream
s开始:

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

如果您愿意,您可以将
三元组
类设置为通用类(然后生成一个
)。

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

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

    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);
List yList=y.collect(Collectors.toList());
List zList=z.collect(Collectors.toList());
流新闻流=
x、 flatMap(a->yList.stream()
.flatMap(b->zList.stream()
地图(c->(a,b,c)的三重结构);
forEach(System.out::println);

像笛卡尔积吗?而
a3 1.1f
的数据类型是什么?这是笛卡尔连接,需要多次迭代值集。由于一个
流只能被迭代一次,首先将每个流收集到
列表中
@ernest_k String,Integer,float或使用
新对象[]{a,b,c}
,或
a+“”+b+“”+c
,因为我们不知道OP想要的结果是什么类型。@Andreas这是可能的,但我觉得很难看。我更喜欢使用合适的类型(因此建议使用类)。@Eran我们应该在最后一个流中使用map,而不是flatMap。谢谢你的回答。
Stream<Triplet> triplets =
    x.stream()
     .flatMap(a -> y.stream()
                    .flatMap (b -> z.stream()
                                    .map(c -> new Triplet(a,b,c))));
    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);