创建一个 lambda 函数来同时迭代集合

Man*_*anu 5 java lambda java-8

我正在尝试 Java 8,我想迭代 2 个集合并为每对值调用一个参数函数。

抽象地说,我想foo(tuple, i)为每次迭代应用一个函数

[ v1, v2, v3, v4, v5, v6 ] (first collection)
[ w1, w2, w3, w4, w5, w6 ] (second collection)
---------------------------
  foo(<v1,w1>, 0)
  foo(<v2,w2>, 1)
  ...
  foo(<v6,w6>, 5)
Run Code Online (Sandbox Code Playgroud)

现在我得到了什么(java和伪代码)

// Type of f?
private <S,U> void iterateSimultaneously(Collection<S> c1, Collection<U> c2, Function f) {
        int i = 0
        Iterator<S> it1 = c1.iterator()
        Iterator<U> it2 = c2.iterator()
        while(it1.hasNext() && it2.hasNext()) {
            Tuple<S, U> tuple = new Tuple<>(it1.next(), it2.next())             

            // call somehow f(tuple, i)

            i++
        }
}
 // ........................

// pseudo code, is this posible in Java?
iterateSimultaneously(c1, c2, (e1, e2, i) -> {
  // play with those items and the i value
})
Run Code Online (Sandbox Code Playgroud)

小智 4

您正在寻找这样的东西吗?

private <S,U> void iterateSimultaneously(Collection<S> c1, Collection<U> c2, BiConsumer<Tuple<S, U>, Integer> f) {
        int i = 0
        Iterator<S> it1 = c1.iterator()
        Iterator<U> it2 = c2.iterator()
        while(it1.hasNext() && it2.hasNext()) {
            Tuple<S, U> tuple = new Tuple<>(it1.next(), it2.next())             
            f.accept(tuple, i);
            i++
        }
}
iterateSimultaneously(c1, c2, (t, i) -> {
    //stuff
})
Run Code Online (Sandbox Code Playgroud)

函数 f 应该返回什么类型?如果没有的话,改为消费者。如果您希望它接受一个元组,您最需要澄清它,就像我在这里所做的那样。这是您要找的吗?