【问题标题】:Applying a closure to an iterator将闭包应用于迭代器
【发布时间】:2013-01-16 12:01:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: groovy iterator


    【解决方案1】:

    你有几个选择:

    假设你有一个像这样的迭代器(它返回一个连续的随机数流):

    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() 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 2014-03-13
      • 2017-11-20
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多