WeeklyStudy / modern-java-in-action

Modern Java in Action Study
0 stars 0 forks source link

findFirst()와 findAny()의 차이점은 무엇이고 언제 사용하는게 좋을까? #14

Open ahah525 opened 1 year ago

ahah525 commented 1 year ago

문제

지금까지 스트림을 쓸 때 findFirst()findAny() 의 차이에 대해 모르는 상태로 이유없이 사용했던 적이 많았다. 책에는 두 메서드의 차이를 각각 다른 예제로 간단하게 설명하고 있다.

더 다양한 예제(e.g. 직렬/병렬 처리했을 때 등)을 실행 및 결과 비교를 해보고 findFirst와 findAny의 차이점어떠한 경우에 사용하면 좋을지에 대해 생각해보자.

관련 목차

참고자료

ahah525 commented 1 year ago

💡findAny()

스트림에서 가장 먼저 탐색되는 요소를 리턴한다.

💡findFirst()

조건에 일치하는 요소들 중에서 스트림에서 순서가 가장 앞에 있는 요소를 리턴한다.

💡findAny() vs findFirst()

1. 순차 스트림

순차 스트림에서 findFirst()findAny() 가 항상 동일한 요소를 리턴하므로 결과에 차이가 없다.

1.1. findFirst()

// 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());

1.2. findAny()

// 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());

2. 병렬 스트림

병렬 스트림에서 findFirst()findAny() 의 결과가 달라질 수 있다.

2.1. findFirst()

// 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());

2.2. findAny()

// 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());

💡결론

Reference