0

有没有办法将闭包应用于返回一个新迭代器的迭代器,该迭代器产生初始迭代器的元素但将闭包应用于这些结果?

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

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

4

1 回答 1

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 库,它包含了这种功能(除了其他东西)。有了这个,你可以这样做:

@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() 
于 2013-02-01T09:49:38.057 回答