Поток Java 8 findFirst() и findAny()

Java

Введение

Совсем недавно нотация, использующая Java 8 Stream API, вводит два часто неправильно понимаемых метода:findAny()а такжеfindFirst(). Опять разница между этими двумя методами и когда использовать его для заметки,

Используйте Stream.findAny()

findAny()Метод позволяет найти любой элемент из Потока, он используется при поиске элементов без учета порядка встреч. Этот метод возвращает необязательный экземпляр, если поток пуст, измените экземпляр на пустой.

@Test
public void createStream_whenFindAnyResultIsPresent_thenCorrect() {
    List<String> list = Arrays.asList("A","B","C","D");
 
    Optional<String> result = list.stream().findAny();
 
    assertTrue(result.isPresent());
    assertThat(result.get(), anyOf(is("A"), is("B"), is("C"), is("D")));
}

В параллельных операциях он может вернуть первый элемент в потоке, но контрмера не гарантируется. Для лучшей производительности при работе с параллельными операциями результат не может быть надежно определен:

@Test
public void createParallelStream_whenFindAnyResultIsPresent_thenCorrect()() {
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    Optional<Integer> result = list
      .stream().parallel()
      .filter(num -> num < 4).findAny();
 
    assertTrue(result.isPresent());
    assertThat(result.get(), anyOf(is(1), is(2), is(3)));
}

Используйте Stream.findFirst()

в настоящее время используетfindFirst()Метод находит первый элемент в потоке. Этот метод используется, когда особенно необходим первый элемент в последовательности. Если последовательность не встречается, он вернет любой элемент из потока. В документации пакета `java.util.stream` говорится:

Потоки могут иметь или не иметь определенного порядка встречи, в зависимости от исходных и промежуточных операций.

Тип возвращаемого значения также является необязательным экземпляром, который также пуст, если Stream также пуст:

@Test
public void createStream_whenFindFirstResultIsPresent_thenCorrect() {
 
    List<String> list = Arrays.asList("A", "B", "C", "D");
 
    Optional<String> result = list.stream().findFirst();
 
    assertTrue(result.isPresent());
    assertThat(result.get(), is("A"));
}

По параллельной схемеfindFirst()Поведение метода не меняется. Если порядок столкновений существует, он всегда будет детерминированным.

В заключение

  • findAny()метод возвращает из любого потока элементов при использовании
  • findFirst()метод возвращает первый элемент в потоке

смотрите подробности

Поток Java 8 findFirst() и findAny()