거두절미하고 본론으로 넘어간다.
옵셔널을 공부하다가 혼자 잘못이해하고 씩씩 대면서 배운 것에 대해 기록하고자 한다. 그래도 그냥 넘어가지 않고 알고 넘어가려는 내 스스로 칭찬해 ~
지연 평가 와 즉시 평가도 적어두긴 하는데, 이건 나중에 따로 포스팅을..ㅎㅎ
스트림의 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가 참 똑똑하니까 잘 안읽게 되는 것 같다..
오늘 내용 요약을 아래와 같이 해보았다.
'Java' 카테고리의 다른 글
[Java] LinkedList의 특징과 스스로 구현해보기 (0) | 2025.06.18 |
---|---|
[Java] synchronized 키워드가 필요한 이유 (예시) (0) | 2025.03.12 |
[Java] 까먹지 말아야 할 Java 스레드 생명 주기 및 상태 전이 (0) | 2025.03.08 |
[Java] 까먹지 말아야 할 Java 메모리 구조 (1) | 2025.03.04 |
[Java] 채팅 프로그램 소켓 연결 구현 1 - 1 대 1 통신을 해보자 (0) | 2025.02.09 |