1. введение
API Java 8 Stream представил два метода, которые часто неправильно понимаются: find Any() и find First() .
В этом кратком руководстве мы рассмотрим разницу между этими двумя методами и то, когда их использовать.
Дальнейшее чтение:
Фильтрация потока необязательных в Java
Потоки примитивных типов в Java 8
Итерируемый поток в Java
2. Используя поток.()
Как следует из названия, метод findAny() позволяет найти любой элемент из потока . Используйте его, когда вы ищете элемент, не обращая внимания на порядок встреч:
Метод возвращает Необязательный экземпляр, который пуст, если Поток пуст:
@Test public void createStream_whenFindAnyResultIsPresent_thenCorrect() { Listlist = 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()() { Listlist = 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() { Listlist = 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 .