попробуйте,
final String firstMatch = Stream.of("a1", "a2", "b1", "c2", "c1")
.filter(s -> s.startsWith("c"))
.findFirst()
.orElse(null);
Вы не можете повторно использовать поток после его создания.Вот почему вы получаете эту ошибку.Сначала вы повторно используете поток и вызываете терминальную операцию res.anyMatch(i -> true)
, а затем другую терминальную операцию res.findFirst()
, ведущую к этой ошибке.Это антипаттерн, и его следует избегать.
Поток должен быть запущен (вызывая промежуточную или терминальную операцию потока) только один раз.Реализация потока может выдать IllegalStateException
, если обнаружит, что поток используется повторно.
Обновление
Согласно приведенному ниже комментарию, это может быть дополнительно упрощено, как,
Stream.of("a1", "a2", "b1", "c2", "c1").filter(s -> s.startsWith("c")).findFirst()
.ifPresent(System.out::println);