Stream에서 어떤 조건에 일치하는 요소(element) 1개를 찾을 때, findAny()
와 findFirst()
API를 사용할 수 있습니다.
findAny()
는 Stream에서 가장 먼저 탐색되는 요소를 리턴하고, findFirst()
는 조건에 일치하는 요소들 중에 Stream에서 순서가 가장 앞에 있는 요소를 리턴합니다.
차이점에 대해서 자세히 알아보겠습니다.
findFirst()
findFirst()
는 filter 조건에 일치하는 element 1개를 Optional로 리턴합니다. 조건에 일치하는 요소가 없다면 empty가 리턴됩니다.
List<String> elements = Arrays.asList("a", "a1", "b", "b1", "c", "c1");
Optional<String> firstElement = elements.stream()
.filter(s -> s.startsWith("b")).findFirst();
System.out.println("findFirst: " + firstElement.get());
Output:
findFirst: b
findAny()
findAny()
도 findFirst()
처럼 조건에 일치하는 요소 1개를 리턴합니다.
List<String> elements = Arrays.asList("a", "a1", "b", "b1", "c", "c1");
Optional<String> anyElement = elements.stream()
.filter(s -> s.startsWith("b")).findAny();
System.out.println("findAny: " + anyElement.get());
Output:
findAny: b
findFirst() vs findAny()
Stream을 직렬로 처리할 때 findFirst()
와 findAny()
는 동일한 요소를 리턴하며, 차이점이 없습니다.
하지만 Stream을 병렬로 처리할 때는 차이가 있습니다.
findFirst()
는 여러 요소가 조건에 부합해도 Stream의 순서를 고려하여 가장 앞에 있는 요소를 리턴합니다.
반면에 findAny()
는 Multi thread에서 Stream을 처리할 때 가장 먼저 찾은 요소를 리턴합니다. 따라서 Stream의 뒤쪽에 있는 element가 리턴될 수 있습니다.
아래 코드는 Stream을 병렬(parallel()
)로 처리할 때, findFirst()
를 사용하는 예제입니다. 여기서 findFirst()
는 항상 b를 리턴합니다.
List<String> elements = Arrays.asList("a", "a1", "b", "b1", "c", "c1");
Optional<String> firstElement = elements.stream().parallel()
.filter(s -> s.startsWith("b")).findFirst();
System.out.println("findFirst: " + firstElement.get());
Output:
findFirst: b
아래 코드는 Stream을 병렬로 처리할 때, findAny()
를 사용하는 예제입니다. 여기서 findAny()
는 실행할 때마다 리턴 값이 달라지며, b1 또는 b를 리턴합니다.
List<String> elements = Arrays.asList("a", "a1", "b", "b1", "c", "c1");
Optional<String> anyElement = elements.stream().parallel()
.filter(s -> s.startsWith("b")).findAny();
System.out.println("findAny: " + anyElement.get());
Output:
findAny: b1
Related Posts
- Java - 람다식(Lambda)과 함수형 인터페이스
- Java - 직렬화(Serialize), 역직렬화(Deserialize)
- Java - do while과 while의 차이점
- Java - List empty(null) 체크, 3가지 방법
- Java - ArrayList 초기화, 4가지 방법
- Java - HashSet.addAll()
- Java - HashSet.contains()
- Java - 2차원 배열 선언, 출력 방법
- Java - 리스트 정렬, 3가지 방법
- Java - HashSet 정렬, 3가지 방법
- Java - 리스트 (List, ArrayList)
- Java - 첫 글자만 대문자로 바꾸는 방법
- Java - hashCode(), 사용하는 이유? 구현 방법?
- Java8의 Stream reduce() 사용 방법 및 예제
- Java - filter, map, flatMap 사용 방법 및 예제
- Java - 2개의 Map 합치기 (merge, putAll)
- Java - ConcurrentModificationException 원인 및 해결 방법
- JUnit - @After와 @AfterClass의 차이점
- JUnit - @Before와 @BeforeClass의 차이점
- java와 javac의 차이점
- Java - 자바(JDK) 버전 확인 방법 (터미널, cmd 명령어)
- Java - java.util.Date를 java.sql.Date로 변환
- Java - 시스템 운영체제(OS) 정보 확인
- Java - 코드 실행 시간 측정
- Java - HashSet.retainAll() 사용 방법 및 예제
- Java - ArrayList.retainAll() 사용 방법 및 예제
- Java - ArrayList를 String으로 변환
- Java - float을 int로 변환
- Java - float을 String으로 변환
- Java - String을 boolean으로 변환
- Java - XML을 JSON으로 변환
- Java - ClassNotFoundException 발생 원인 및 해결 방법
- Java - private 생성자를 사용하는 이유
- Java - non-static method cannot be referenced from a static context
- Java - NoSuchMethodError 원인 및 해결 방법