코딩마을방범대
Optional에 대하여 본문
728x90
Optional에 대하여
- Object를 리턴하는데 null일 가능성이 있다면 Optional로 래핑하는 것을 권장
- 매핑 함수의 적용 결과가 null인 경우 빈 Optional을 반환(메소드를 체이닝했을 때 중간에 null이 있어도 빈 Optional로 계속해서 이어나갈 수 있음)
메소드체이닝이란?
메소드를 줄줄이 엵어서 메소드를 계속해서 사용할 수 있게끔 하는 방법
setter() 메소드에서 void가 아닌 세팅된 객체를 리턴
map과 flatmap
- A type을 B type으로 바꾼다는 뜻(매핑)
- Optional의 값이 있는 경우에만 실행
map | 결과를 Optional로 감싸서 리턴 |
flatmap | 감싸지 않고 반환 |
orElse와 orElseGet 의 차이점
구분 | 설명 |
orElse() | 내부 객체의 상태와 상관없이 무조건 실행 Optional 내부 객체가 not null이라서 orElse가 결과값을 반환하지는 않더라도 실행됨 |
orElseGet() | 객체가 null인 경우에만 실행 |
orElseThrow 란
- 값이 없다면 에러를 발생시킬 수 있는 메소드
obj.orElseThrow(() -> new Exception("throw exception"));
isPresent 란
- 값이 있는지 없는지 확인할 수 있는 메소드
findById(4).ifPresent((user) -> System.out.println(user.getName()));
Optional 사용 시 주의할 점
1. Optional 변수에 null 할당 금지
- 반환 값으로 null을 사용하는 것이 위험하기 때문에 등장한 것이 Optional이므로
Optional.empty()(내부 값을 null로 초기화한 싱글턴 객체) 메서드를 사용해야 함 - 빈 Optional 객체에 get() 메서드를 호출한 경우 NoSuchElementException이 발생하기 때문에 orElse 메소드를 사용
2. 원시 타입의 Optional에는 OptionalInt, OptionalLong, OptionalDouble 사용을 고려할 것
- 원시 타입(primitive type)을 Optional로 사용해야 할 때는 박싱과 언박싱을 거치면서 오버헤드가 생기게 되므로
Optional의 제네릭 타입에 맞춰야 하는 경우가 아니라면, int, long, double 타입에는 OptionalXXX 타입 사용을 고려하는 것이 좋음
OptionalInt maybeInt = OptionalInt.of(2);
OptionalLong maybeLong = OptionalLong.of(3L);
OptionalDouble maybeDouble = OptionalDouble.empty();
3. 값에 대해 미리 정의된 규칙(제약사항)이 있는 경우에는 filter 사용을 고려할 것
- 인자로 전달된 predicate이 참인 경우에는 기존의 내부 값을 유지한 Optional이 반환되고, 그렇지 않은 경우에는 비어 있는 Optional을 반환
Optional.ofNullable(username)
.filter(this::isOverLength)
.isPresent();
참고사이트
728x90
'💡 백엔드 > Java' 카테고리의 다른 글
Java에서 OS의 시스템에 접근하기 (0) | 2023.07.25 |
---|---|
SpringBoot에서 Slack Webhoook 사용하기 (0) | 2023.07.25 |
웹 소켓을 이용한 메시지 전송 프로세스의 이해 (1) | 2023.07.13 |
Java의 타이머 (Timer) (0) | 2023.06.22 |
Guava Cache (0) | 2023.06.20 |