Реализация интерфейса итератора с картой не работает с потоками Java 8

Я начну с кода:

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 и использование в списках, все, кажется, обрабатывают их одинаково. Однако API Java 8 Streams, похоже, рассматривает их по-разному, как показано выше. Как и почему? Могу ли я что-нибудь сделать с версией интерфейса, реализующей карту, чтобы она работала правильно?

1 ответ

Решение

Кажется, это было исправлено в Groovy 2.3.8

Возможно, это было похоже на эту ошибку, которая была исправлена ​​в том же выпуске: https://issues.apache.org/jira/browse/GROOVY-7104

Другие вопросы по тегам