Java Stream의 findAny() 메서드는 스트림에 포함된 임의의 요소를 Optional 객체로 반환합니다. 만약 스트림이 비어 있다면 빈(empty) Optional을 반환합니다.
여기서 Optional은 값이 존재할 수도 있고 존재하지 않을 수도 있는 컨테이너(container) 객체입니다. 즉, null이 아닌 값을 담고 있거나 아무 값도 담고 있지 않을 수 있습니다.
findAny() 메서드의 특징
- 스트림에서 임의의(arbitrary) 요소 하나를 반환합니다.
- 병렬 스트림(parallel stream) 환경에서 성능 최적화를 위해 자주 사용됩니다.
- 반환 타입은
Optional<T>이므로, 값을 꺼내기 전에 반드시 존재 여부를 확인해야 합니다.
예제 1: 정수 리스트에서 findAny() 사용하기
다음은 정수 리스트에 대해 findAny() 메서드를 구현한 예제입니다.
import java.util.*;
public class Demo {
public static void main(String[] args){
List<Integer> list = Arrays.asList(10, 20, 30, 40, 50);
Optional<Integer> res = list.stream().findAny();
if (res.isPresent()) {
System.out.println(res.get());
} else {
System.out.println("None!");
}
}
}출력 결과
10
위 예제에서 isPresent() 메서드로 Optional에 값이 있는지 확인한 후, 값이 존재하면 get()으로 해당 값을 출력합니다. 순차 스트림(sequential stream)에서는 일반적으로 첫 번째 요소인 10이 반환됩니다.
예제 2: 문자열 리스트에서 findAny() 사용하기
이번에는 문자열 리스트를 대상으로 findAny() 메서드를 살펴보겠습니다.
import java.util.*;
public class Demo {
public static void main(String[] args) {
List<String> myList = Arrays.asList("Kevin", "Jofra", "Tom", "Chris", "Liam");
Optional<String> res = myList.stream().findAny();
if (res.isPresent()) {
System.out.println(res.get());
} else {
System.out.println("None!");
}
}
}출력 결과
Kevin
정리
findAny()는 스트림에서 임의의 요소를 안전하게 조회할 수 있도록 Optional 형태로 반환하는 메서드입니다. 스트림이 비어 있을 가능성이 있다면 isPresent() 또는 orElse() 같은 메서드를 활용해 null 관련 오류 없이 안전하게 처리하는 것이 좋습니다.