Реализация интерфейса итератора с картой не работает с потоками 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