【问题标题】:Implementing iterator interface with map doesn't work with java 8 streams使用 map 实现迭代器接口不适用于 java 8 流
【发布时间】: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 coercion


【解决方案1】:

似乎这已在 groovy 2.3.8 中修复

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2021-09-14
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多