본문 바로가기

[Java] Optional.filter() vs Stream.filter()

@xuv22025. 5. 23. 15:58

거두절미하고 본론으로 넘어간다.

오늘의 나

옵셔널을 공부하다가 혼자 잘못이해하고 씩씩 대면서 배운 것에 대해 기록하고자 한다. 그래도 그냥 넘어가지 않고 알고 넘어가려는 내 스스로 칭찬해 ~

지연 평가 와 즉시 평가도 적어두긴 하는데, 이건 나중에 따로 포스팅을..ㅎㅎ


스트림의 filter -> 지연평가

다음 예시를 간단히 보자

List<Integer> list = Arrays.asList(1, 2, 3, 4);
List<Integer> filtered = list.stream()
                             .filter(n -> n % 2 == 0)
                             .collect(Collectors.toList()); // [2, 4]

늘 스트림을 쓸 때 주의해야할 점은 스트림 파이프라인 연산은 절대 원본 데이터에 영향을 주지 않는 다는 점이다

먼저, 위 코드에서 흐름은 다음과 같다

기존 데이터를 스트림화 -> 짝수 조건으로 리스트를 필터링(중간연산) -> collect로 최종 연산하면 2, 4를 리스트로 반환 받는다.

즉, list.stream().filter().collect() 연산은 기존 데이터에 영향 없이 필터링된 데이터를 제외 시키고 남은 값을 리턴한다.


Optional의 filter -> 즉시평가

이제, 옵셔널의 필터를 보자.

먼저, 내가 스트림으로 생각하고 코드를 분석하다보니 실수를 했다는 점을 밝힌다..

Optional<Integer> opt = Optional.of(10);
Optional<Integer> filtered = opt.filter(n -> n > 5); // Optional[10]
Optional<Integer> empty = opt.filter(n -> n > 20);   // Optional.empty

요새 내가 메서드 시그니처 자동완성 때문에 잘 읽지 않아서, 그냥 뒤에 메서드만 보고 코드를 읽으려는 쓰레기 같은 습관이 생겨서인지, 해당 코드도 스트림이라고 생각하고 코드를 분석하려고 했다.

아무튼.. 자세히 보면 옵셔널 필터의 흐름은 다음과 같다

숫자 10을 옵셔널로 감싼다 ->  이후 두가지 로직이 있는데,

1. 옵셔널 내부의 값이 5보다 큰지 필터링한다(이때, 옵셔널을 반환) -> 조건이 참이므로 그대로 Optional(10)이 반환된다

2. 옵셔널 내부의 값이 20보다 큰지 필터링한다(이때도 옵셔널을 반환) -> 조건이 거짓 -> [주의 : 스트림처럼 값을 아예 제외하는 것이 아닌 Optional.empty()가 반환된다 !!!!!!!!!!!!]


결론

메서드 시그니처를 항상 잘 봐야한다. IDE가 참 똑똑하니까 잘 안읽게 되는 것 같다..

오늘 내용 요약을 아래와 같이 해보았다.

xuv2
@xuv2 :: xuvlog

폭싹 늙었수다

목차