使用map实现迭代器接口并不适用于java 8流

时间:2014-08-18 16:55:03

标签: 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 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似乎对它们有所不同。怎么样和为什么?我可以对地图实现界面版本做些什么来使其正常运行吗?

1 个答案:

答案 0 :(得分:1)

似乎已经在groovy 2.3.8中修复了

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