如何将多个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)
答案 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]"
映射器获取要压缩的元素列表并返回压缩值。在第一个示例中,它将值相加在一起,而在第二个中返回一个数组。