将闭包应用于迭代器

时间:2013-02-01 07:46:52

标签: groovy iterator

有没有办法将闭包应用于Iterator,它返回一个新的Iterator,它生成初始迭代器的元素,但是闭包应用于那些结果?

我知道我可以写一个执行此操作的Iterator类,但我不想重新发明轮子。

请注意,我需要在没有实际遍历迭代器的情况下工作(即,这应该适用于没有结束的迭代器)。

1 个答案:

答案 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() 
相关问题