我将从代码开始:
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似乎对它们有所不同。怎么样和为什么?我可以对地图实现界面版本做些什么来使其正常运行吗?
答案 0 :(得分:1)
似乎已经在groovy 2.3.8中修复了
它可能类似于同一版本中修复的此错误: https://issues.apache.org/jira/browse/GROOVY-7104