有没有办法将闭包应用于Iterator,它返回一个新的Iterator,它生成初始迭代器的元素,但是闭包应用于那些结果?
我知道我可以写一个执行此操作的Iterator类,但我不想重新发明轮子。
请注意,我需要在没有实际遍历迭代器的情况下工作(即,这应该适用于没有结束的迭代器)。
答案 0 :(得分:2)
您有几个选择:
假设你有一个这样的迭代器(它返回连续的随机数流):
def rnd = [ hasNext:{ true }, next:{ Math.random() } ] as Iterator
一个选项是编写一个带有迭代器和闭包的函数,并将闭包应用于每个下一个调用(并委托给hasNext的原始迭代器),如:
Iterator mappedIterator( Iterator i, Closure c ) {
[ hasNext:{ i.hasNext() }, next:{ c( i.next() ) } ] as Iterator
}
那么我们就可以做到:
def rndTimes100 = mappedIterator( rnd ) { it * 100 }
// collect 10 randoms from the stream into a list
println rndTimes100.take( 10 ).collect()
另一个可用选项是使用包含此类功能的groovy-stream library(除了其他内容)。有了这个,你可以这样做:
@Grab( 'com.bloidonia:groovy-stream:0.5.2' )
import groovy.stream.Stream
def rnd = [ hasNext:{ true }, next:{ Math.random() } ] as Iterator
def rndStream = Stream.from rnd map { it * 100 }
// collect 10 randoms from the stream into a list
println rndStream.take( 10 ).collect()