반응형
Optional이 없었을 때 코딩 방식
- null 체크 문장을 작성해야 했다.
- 사람인지라 까먹을 수 있다.
- null 을 리턴하는거 자체가 문제다.
- 리소스가 낭비된다.
Optional을 써서 더 명시적으로 표현할 수 있게 됐다.
널일 수 있는 값의 경우 Optional<T> 로 감싸서 리턴할 수 있다.
반환값으로만 쓰도록 권장한다.
- Optional 변수에도 null이 들어올 수 있으므로 외부에서 들어오는 경우 충분히 null일 수 있다.
- 맵의 키 타입
- 인스턴스 필드
프리미티브 타입은 그냥 Optional을 쓰면 박싱/언박싱이 자주 일어나서 성능이 떨어진다.
제공되는 OptionalInt, OptioanlLong 같은걸 쓰자.
나는 예외나 isPresent 보다는 간단하게 orElse를 주로 많이 쓴다.
ㅋㅋㅋ 그리고 맵의 키 타입으로 쓰지 말라고 했는데 최근에 그렇게 한 경우가 있다. groupingBy를 쓰면서
테이블에 세종류의 데이터가 같이 들어가는 경우 근데 각자 키 값이 들어가는 컬럼이 다른 경우 타입에 따라서 셋중에 하나만 값이 있고, 나머지 두개는 널인데 셋 다 한번에 그룹핑을 해야된다. 어쩔수 없는 상황으로 보인다. 내가 설계를 바꿀수는 없으니까..
orElse 보다 좋은게 orElseGet(Supplier) 이란다.
orElse는 안의 내용을 항상 실행한다.( 객체를 생성하는 경우 값이 있든 없든 항상 호출해서 객체를 생성함)
그게 별로니까. 없을때만 함수가 호출되도록 Supplier(메서드)를 넘기면 그 안의 내용을 필요한 경우에만 실행하게 된다.
리액트 공부할때 많이 했던 메서드 넘기는 느낌이 난다.
return Optional.empty() === return null
Optional<T> val1 = Optional<T>.of(T)
Optional<T> val2 = Optional<T>.ofNullable(T)
T t = Optional<T>.empty().get()
boolean isPresent = Optional<T>.empty().isPresent()
boolean isEmpty = Optional<T>.empty().isEmpty()
Optional<T>.empty().ifPresent(action);
Optional<T>.empty().ifPresentOrElse(action);
Optional<T>.empty().orElse(T)
Optional<T>.empty().orElseThrow()
Optional<T>.empty().orElseGet(Supplier
필터
Optional<T> t2 = t.filter(op -> op.getId());
맵
Optional<int> t3 = t.map(op -> op.getId());
플랫맵
Optional<Optional<int>> t4 = t.map(op -> op.getOptionalValue());
Optional<int> t5 = t.flatMap(op -> op.getOptionalValue());
옵셔널의 flatMap은 옵셔널 값을 Map 하는 경우 옵셔널을 하나 생략하는 데 사용한다.
반응형
'백엔드 > Java' 카테고리의 다른 글
StringUtils.hasText 메서드 : C#의 String.IsNullorEmpty 메서드 대응 (0) | 2021.03.28 |
---|---|
Collectors.groupingBy 널(null) 키 사용하기 (1) | 2021.03.08 |
함수형 인터페이스 (0) | 2021.03.07 |
멀티스레드 처리 (0) | 2020.12.07 |
JSON Enum 파싱 (0) | 2020.11.10 |
댓글