1

我将从代码开始:

import java.util.stream.Stream
import java.util.stream.StreamSupport
def hasMore1 = true
def iter1 = new Iterator<Integer>() {
    boolean hasNext() { def retVal = hasMore1; hasMore1 = false; retVal }
    Integer next() { 42 }
}

def hasMore2 = true
def iter2 = [
    hasNext: { -> def retVal = hasMore2; hasMore2 = false; retVal },
    next: { -> 42 }
] as Iterator<Integer>

def stream1 = StreamSupport.stream(Spliterators.spliterator(iter1, 1, 0), false)
def stream2 = StreamSupport.stream(Spliterators.spliterator(iter2, 1, 0), false)        
stream1.forEach { println it } // prints 42
stream2.forEach { println it } // throws java.lang.UnsupportedOperationException

这两种在 groovy 中实现迭代器的方法似乎在语义上是等价的,并且在正常用例中,例如使用 foreach 进行迭代,以及在列表推导中使用似乎都将它们视为相同。然而,Java 8 Streams api 似乎对它们进行了不同的处理,如上所示。如何以及为什么?我可以对地图实现接口版本做些什么来使其正常运行吗?

4

1 回答 1

1

似乎这已在 groovy 2.3.8 中修复

它可能类似于在同一版本中修复的此错误: https ://issues.apache.org/jira/browse/GROOVY-7104

于 2015-03-30T18:34:23.187 回答