通过组合多个流的结果来创建流

时间:2016-09-11 18:03:08

标签: java java-stream

如何将多个Streams转换为一个Stream?例如,我有3个IntStreams,我想将它们组合成一个int数组流。

在Javadoc中,大多数Stream操作都将一个流作为输入,concat不回答我的用例。

这就是我的想法

Stream 1: 1, 2, 3
Stream 2: 4, 5, 6
Combined Stream ex1: [1,4],[2,5],[3,6]
Combined Stream ex2: 1+4,2+5,3+6
Combined Stream ex3: new MyObject(1,4), new MyObject(2,5), new MyObject(3,6)

2 个答案:

答案 0 :(得分:2)

可悲的是,Stream没有为你做这件事的本地人。 API的一个不幸的缺点。

也就是说,您可以通过在每个流上取出Iterator来完成此操作,类似于:

public static <T,U,R> Stream<R> zipStreams (Stream<T> a, Stream<U> b, BiFunction<T,U,R> zipFunc) {
    Iterator<T> itA = a.iterator();
    Iterator<U> itB = b.iterator();
    Iterator<R> itRet = new Iterator<R>() {

        @Override
        public boolean hasNext() {
            return itA.hasNext() && itB.hasNext();
        }

        @Override
        public R next() {
            return zipFunc.apply(itA.next(), itB.next());
        }

    };
    Iterable<R> ret = () -> itRet;
    return StreamSupport.stream(ret.spliterator(), a.isParallel() || b.isParallel());
}

答案 1 :(得分:2)

在功能方面,问题归结为压缩流列表,并为每个元素应用自定义拉链。

There is no facility直接使用Stream API执行此操作。我们可以使用protonpack库的第三方库来提供zip方法。考虑数据:

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

你可以

Stream<Integer> stream = StreamUtils.zip(streams, l -> l.stream().mapToInt(i -> i).sum());
// the Stream is now "1+4,2+5,3+6"

Stream<Integer[]> stream = StreamUtils.zip(streams, l -> l.toArray(new Integer[l.size()]));
// the Stream is now "[1,4][2,5][3,6]"

映射器获取要压缩的元素列表并返回压缩值。在第一个示例中,它将值相加在一起,而在第二个中返回一个数组。

相关问题