一起迭代两个Java-8流

一起迭代两个Java-8流,java,java-8,java-stream,Java,Java 8,Java Stream,我想一起迭代两个Java-8流,这样在每个迭代步骤中都有两个参数。 类似于此,其中somefunction生成类似于Stream的内容 streamas; 流bs; somefunction(as、bs) .forEach((a,b)->foo(a,b)); //或者类似的 somefunction(as、bs) .forEach((成对abs)->foo(abs.left(),abs.right()); 我想知道,尽管Java中没有Pair,但Java是否提供了类似的功能:-( 如果没有这样

我想一起迭代两个Java-8流,这样在每个迭代步骤中都有两个参数。 类似于此,其中
somefunction
生成类似于
Stream
的内容

streamas;
流bs;
somefunction(as、bs)
.forEach((a,b)->foo(a,b));
//或者类似的
somefunction(as、bs)
.forEach((成对abs)->foo(abs.left(),abs.right());
我想知道,尽管Java中没有
Pair
,但Java是否提供了类似的功能:-( 如果没有这样的API函数,有没有其他方法可以同时迭代两个流

static <A, B> Stream<Pair<A, B>> zip(Stream<A> as, Stream<B> bs)
{
    Iterator<A> i=as.iterator();
    return bs.filter(x->i.hasNext()).map(b->new Pair<>(i.next(), b));
}

如果你想要并行能力的拉链,你应该考虑<代码>流的来源。例如,你可以像

一样压缩两个<代码> ARARYLIST/<代码> s(或者任何<代码>随机访问列表< /代码>)
ArrayList l1=新的ArrayList();
ArrayList l2=新的ArrayList();
IntStream.range(0,Math.min(l1.size(),l2.size())
.mapToObj(i->新对(l1.get(i),l2.get(i)))
. …


⑨(除非您直接实现
拆分器

刚刚发现,此解决方案不适用于无限多个Bs流。在这种情况下,这是一个无止境的循环。必须以某种方式限制B流。但是,我没有找到一个对上述代码进行小改动的解决方案。链接的答案似乎也适用于无限多个Bs流:@F.Böller:对,解决问题没有小改动他的。您链接的解决方案可能会起作用,但我建议您在许可问题上要小心,因为正如回答者自己所说,代码是从测试版jdk源代码中c&p'ed的。您还应该记住,可能还有其他问题,因为代码的作者可能有理由将其从jdk中删除…
static <A, B> Stream<Pair<A, B>> zip(Stream<A> as, Stream<B> bs)
{
    Iterator<A> i=as.iterator();
    return bs.filter(x->i.hasNext()).map(b->new Pair<>(i.next(), b));
}
static <A, B> Stream<Pair<A,B>> zip(Stream<A> as, Stream<B> bs) {
    Iterator<A> i1 = as.iterator();
    Iterator<B> i2 = bs.iterator();
    Iterable<Pair<A,B>> i=()->new Iterator<Pair<A,B>>() {
        public boolean hasNext() {
            return i1.hasNext() && i2.hasNext();
        }
        public Pair<A,B> next() {
            return new Pair<A,B>(i1.next(), i2.next());
        }
    };
    return StreamSupport.stream(i.spliterator(), false);
}
ArrayList<Foo> l1=new ArrayList<>();
ArrayList<Bar> l2=new ArrayList<>();
IntStream.range(0, Math.min(l1.size(), l2.size()))
         .mapToObj(i->new Pair(l1.get(i), l2.get(i)))
         . …