在groovy中懒洋洋地交叉两个迭代

时间:2014-03-24 00:05:54

标签: groovy guava

如果我有两个迭代,我想通过懒惰地交叉它们来创建第三个迭代。怎么能在groovy中完成。我之前可以用番石榴做过这个。

1 个答案:

答案 0 :(得分:3)

假设你的意思是“通过”将元素连接在一起,一次一个“,我写了一个包groovy-stream,可以懒得这样做:

@Grab( 'com.bloidonia:groovy-stream:0.8.1' )
import groovy.stream.*

Iterable a = [ 1, 2, 3 ]
Iterable b = [ 4, 5, 6 ]

Stream.from( a )
      .zip( b ) { x, y -> [ x, y ] }
      .each { println it }

将打印:

[1, 4]
[2, 5]
[3, 6]

编辑:

你当然可以自己动手:

Iterable a = [ 1, 2, 3 ]
Iterable b = [ 4, 5, 6 ]

Iterable zip = new LazyZipper( a:a, b:b, joiner:{ x, y -> [ x, y ] } )

for( r in zip ) {
    println r
}

class LazyZipper implements Iterable {
    Iterable a
    Iterable b
    Closure  joiner

    class LazyIterator implements Iterator {
        Iterator ia
        Iterator ib

        void remove() { throw new UnsupportedOperationException() }
        boolean hasNext() { ia.hasNext() && ib.hasNext() }
        Object next() { joiner( ia.next(), ib.next() ) }
    }

    Iterator iterator() {
        new LazyIterator( ia:a.iterator(), ib:b.iterator() )
    }
}