【发布时间】:2014-08-18 16:55:03
【问题描述】:
我将从代码开始:
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 似乎对它们进行了不同的处理,如上所示。如何以及为什么?我可以对地图实现接口版本做些什么来使其正常运行吗?
【问题讨论】:
-
什么版本的 groovy?
-
有趣的是,它抱怨缺少
forEachRemaining方法,即default method on Iterator interface。 -
groovy 版本 2.3.6。 jdk 1.8.0_11