Open ahah525 opened 1 year ago
스트림에서 가장 먼저 탐색되는 요소를 리턴한다.
조건에 일치하는 요소들 중에서 스트림에서 순서가 가장 앞에 있는 요소를 리턴한다.
순차 스트림에서 findFirst()
와 findAny()
가 항상 동일한 요소를 리턴하므로 결과에 차이가 없다.
// given
List<String> elements = Arrays.asList("a", "a1", "b", "b1", "c", "c1");
// when
Optional<String> first = elements.stream()
.filter(s -> s.startsWith("b"))
.findFirst();
// b
System.out.println(first.get());
b
// given
List<String> elements = Arrays.asList("a", "a1", "b", "b1", "c", "c1");
// when
Optional<String> any = elements.stream()
.filter(s -> s.startsWith("b"))
.findAny();
// b
System.out.println(any.get());
b
병렬 스트림에서 findFirst()
와 findAny()
의 결과가 달라질 수 있다.
// given
List<String> elements = Arrays.asList("a", "a1", "b", "b1", "c", "c1");
// when
Optional<String> first = elements.stream()
.parallel()
.filter(s -> s.startsWith("b"))
.findFirst();
// b
System.out.println(first.get());
b
// given
List<String> elements = Arrays.asList("a", "a1", "b", "b1", "c", "c1");
// when
Optional<String> any = elements.stream()
.parallel()
.filter(s -> s.startsWith("b"))
.findAny();
// b or b1
System.out.println(any.get());
b
혹은 b1
(실행할 때마다 리턴값이 달라진다)순차 스트림
에서는 findFirst()
와 findAny()
의 결과값이 동일하다.
순차 스트림
에서 findFirst()
의 결과값은 항상 맨 첫번째 요소
다.순차 스트림
에서 findAny()
의 결과값은 항상 맨 첫번째 요소
다.(단일 스레드로 데이터가 순차적으로 들어오기 때문에)병렬 스트림
에서는 findFirst()
와 findAny()
의 결과값이 다를 수 있다.
병렬 스트림
에서 findFirst()
의 결과값은 항상 맨 첫번째 요소
다.병렬 스트림
에서 findAny()
의 결과값은 예상 불가
다.(멀티 스레드로 어떤 데이터가 먼저 들어올지 알 수 없기 때문에)병렬 스트림
에서 순서에 상관없이 요소를 찾는 경우라면 성능상 이점을 위해 findAny()
를 사용하자.하지만, 매번 같은 결과가 보장되어야 한다면 findFirst()
를 사용하자.
단, 원본 데이터가 순서가 없는 컬렉션(e.g. HashSet)
인 경우, findFirst()
는 동일한 결과값을 보장하지 않는다.
// given
Set<String> set = new HashSet<>();
set.addAll(Arrays.asList("b", "b1", "c", "c1"));
// when
Optional<String> any1 = set.stream()
.findFirst();
// b
// [b, c, c1, b1]
System.out.println(any1.get());
System.out.println(set);
//
set.add("a");
// when
Optional<String> any2 = set.stream()
.findFirst();
// a
// [a, b, c, c1, b1]
System.out.println(any2.get());
System.out.println(set);
문제
지금까지 스트림을 쓸 때
findFirst()
와findAny()
의 차이에 대해 모르는 상태로 이유없이 사용했던 적이 많았다. 책에는 두 메서드의 차이를 각각 다른 예제로 간단하게 설명하고 있다.더 다양한 예제(e.g. 직렬/병렬 처리했을 때 등)을 실행 및 결과 비교를 해보고 findFirst와 findAny의 차이점과 어떠한 경우에 사용하면 좋을지에 대해 생각해보자.
관련 목차
참고자료