Проверить фильтр нашел любой элемент и получить первый элемент - PullRequest
0 голосов
/ 04 июня 2018

Я хочу проверить, найдено ли что-либо filter на Stream и, если найдено, вернуть первый элемент.Я пробовал это:

Stream<String> res= Stream.of("a1", "a2", "b1", "c2", "c1")
.filter(s -> s.startsWith("c"));

if(res.anyMatch(i->true))
     System.out.println(res.findFirst().get());

, но это дает мне следующую ошибку:

java.lang.IllegalStateException: поток уже был обработан или закрыт

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Используйте findFirst и ifPresent:

Stream.of("a1", "a2", "b1", "c2", "c1")
      .filter(s -> s.startsWith("c"))
      .findFirst()
      .ifPresent(System.out::println);

или если вы хотите выполнить другую операцию, если findFirst() возвращает пустое Optional<T>, тогда используйте

Optional<String> result =
    Stream.of("a1", "a2", "b1", "c2", "c1")
          .filter(s -> s.startsWith("c"))
          .findFirst();
if(result.isPresent()){ System.out.println(result.get());}
else{ System.out.println("nothing found");};

или по состоянию на JDK9-

 Stream.of("a1", "a2", "b1", "c2", "c1")
       .filter(s -> s.startsWith("c"))
       .findFirst()
       .ifPresentOrElse(System.out::println, () -> System.out.println("nothing found"));
0 голосов
/ 04 июня 2018

попробуйте,

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...