如果我有两个可迭代对象,并且我想通过延迟相交来创建第三个可迭代对象。这怎么能在groovy中完成呢?我以前可以并且已经使用 Guava 做到了这一点。
最佳答案
假设你的意思是“将元素连接在一起,一次一个”,我写了一个包 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() )
}
}
关于groovy - 在groovy中惰性地相交两个可迭代对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22598883/