Groovy 用map实现迭代器接口不需要';不能使用Java8流

Groovy 用map实现迭代器接口不需要';不能使用Java8流,groovy,coercion,Groovy,Coercion,我将从代码开始: 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 h

我将从代码开始:

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
import java.util.stream.stream
导入java.util.stream.StreamSupport
def hasMore1=真
def iter1=新迭代器(){
布尔hasNext(){def retVal=hasMore1;hasMore1=false;retVal}
整数next(){42}
}
def hasMore2=true
def iter2=[
hasNext:{->def retVal=hasMore2;hasMore2=false;retVal},
下一步:{->42}
]作为迭代器
def stream1=StreamSupport.stream(Spliterators.spliterator(iter1,1,0),false)
def stream2=StreamSupport.stream(Spliterators.spliterator(iter2,1,0),false)
stream1.forEach{println it}//打印42
stream2.forEach{println it}//抛出java.lang.UnsupportedOperationException

这两种在groovy中实现迭代器的方法在语义上似乎是等价的,在正常的用例中,如使用foreach进行迭代和在列表理解中使用,似乎都是一样的。然而,Java8StreamsAPI似乎对它们的处理方式不同,如上所示。如何以及为什么?我可以对映射实现接口版本做些什么,使其正确运行吗?

groovy 2.3.8似乎已经解决了这一问题

它可能与同一版本中修复的此错误类似:

groovy的哪个版本?有趣的是,它抱怨缺少一个
foreachRestain
方法,即.groovy版本2.3.6。jdk 1.8.0_11