有没有办法将闭包应用于返回一个新迭代器的迭代器,该迭代器产生初始迭代器的元素但将闭包应用于这些结果?
我知道我可以编写一个执行此操作的 Iterator 类,但我不想重新发明轮子。
请注意,我需要它在没有实际遍历迭代器到末尾的情况下工作(即这应该在没有结束的迭代器上工作)。
你有几个选择:
假设您有一个像这样的迭代器(它返回一个连续的随机数流):
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 库,它包含了这种功能(除了其他东西)。有了这个,你可以这样做:
@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()