Ошибка Java 8 с Stream.of()- как поток и объединение их?
Почему следующий код Java 8 показывает ошибку при втором вызове get()?
Stream<String> aStream = Stream.concat(Stream.of("A"), Stream.of("B"));
String a = stream.findFirst().get();
String b = stream.findFirst().get();
Поток "aStream" должен видеть два значения: "A" и "B". Однако попытка прочитать что-либо после того, как первый элемент уже израсходован, дает
java.lang.IllegalStateException: stream has already been operated upon or closed
Разве это не ошибка в Java 8? Во-первых, почему не потребляется Stream.of()
созданный поток возвращает Optional
с isPresent()==false
? Во-вторых, почему не Stream.concatenate()
правильно объединить такие Stream.of()
созданные потоки?
2 ответа
Stream.concatenate()
объединяет два Stream
s. Тем не менее, как только вы выполняете терминальную операцию комбинированного Stream
- stream.findFirst()
- с этим ничего больше не поделаешь Stream
, Вы можете запустить только одну терминальную операцию Stream
, Вот почему это называется "терминал".
Если вы хотите получить более одного элемента в сочетании Stream
используйте другую операцию терминала, такую как collect
:
List<String> list = stream.collect(Collectors.toList());
Чтобы уточнить, в сочетании Stream
это один Stream<String>
не Stream
из Stream
s. Следовательно findFirst()
потребляет весь вместе взятый Stream
не только первый Stream
который был использован для создания комбинированного Stream
,
Так как Stream.findFirst()
является терминальной операцией, и терминальные операции могут выполняться только один раз для данного потока.