groovy - 在groovy中惰性地相交两个可迭代对象

标签 groovy guava

如果我有两个可迭代对象,并且我想通过延迟相交来创建第三个可迭代对象。这怎么能在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/

相关文章:

JAVA Guava /集合: How to use a predefined list as a predicate to sort another list by?

java - 如何调用 Function<Void,Void>.apply()?

Grails select 不会返回正确的数据

xml - Grail 深度 XML 转换

jenkins - 使用 Jenkins 评估 Groovy 脚本时出现 EnvInject 错误

java - 如何将条目填充到加载缓存 Guava 中?

java - 使用java实现公共(public)后缀提取

json - 如何将默认Grails标记库导入JSON View

testing - Spock MissingMethodException

java - Google Collections 中的惰性不可修改列表