Рубрики
Без рубрики

Java 8 Stream findFirst() против find Any()

В статье объясняется разница между Java 8 Stream findFirst и find Any методом в последовательном и параллельном сценариях.

Автор оригинала: baeldung.

1. введение

API Java 8 Stream представил два метода, которые часто неправильно понимаются: find Any() и find First() .

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

Дальнейшее чтение:

Фильтрация потока необязательных в Java

Потоки примитивных типов в Java 8

Итерируемый поток в Java

2. Используя поток.()

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

Метод возвращает Необязательный экземпляр, который пуст, если Поток пуст:

@Test
public void createStream_whenFindAnyResultIsPresent_thenCorrect() {
    List list = Arrays.asList("A","B","C","D");

    Optional 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 list = Arrays.asList(1, 2, 3, 4, 5);
    Optional result = list
      .stream().parallel()
      .filter(num -> num < 4).findAny();

    assertTrue(result.isPresent());
    assertThat(result.get(), anyOf(is(1), is(2), is(3)));
}

3. Использование Stream.findFirst()

Метод findFirst() находит первый элемент в потоке|/. Очевидно, что этот метод используется, когда вы специально хотите получить первый элемент из последовательности.

Когда нет порядка встреч, он возвращает любой элемент из потока |. В документации по пакету java.util.streams говорится::

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

Возвращаемый тип также является Необязательным экземпляром, который пуст, если Поток тоже пуст:

@Test
public void createStream_whenFindFirstResultIsPresent_thenCorrect() {

    List list = Arrays.asList("A", "B", "C", "D");

    Optional result = list.stream().findFirst();

    assertTrue(result.isPresent());
    assertThat(result.get(), is("A"));
}

Поведение метода findFirst не изменяется в параллельном сценарии. Если порядок встреч существует, он всегда будет вести себя детерминированно.

4. Заключение

В этом уроке мы рассмотрели методы find Any() и findFirst() API потоков Java 8. Метод findAny() возвращает любой элемент из потока , в то время как метод findFirst() возвращает первый элемент в потоке .

Вы можете найти полный исходный код и все фрагменты кода для этой статьи на GitHub .