Ошибка 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() объединяет два Streams. Тем не менее, как только вы выполняете терминальную операцию комбинированного Stream - stream.findFirst() - с этим ничего больше не поделаешь Stream, Вы можете запустить только одну терминальную операцию Stream, Вот почему это называется "терминал".

Если вы хотите получить более одного элемента в сочетании Streamиспользуйте другую операцию терминала, такую ​​как collect:

List<String> list = stream.collect(Collectors.toList());

Чтобы уточнить, в сочетании Stream это один Stream<String>не Stream из Streams. Следовательно findFirst() потребляет весь вместе взятый Streamне только первый Stream который был использован для создания комбинированного Stream,

Так как Stream.findFirst() является терминальной операцией, и терминальные операции могут выполняться только один раз для данного потока.

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