Optional 이란 NullPointerException을 피하기 위해 만들어진 클래스입니다.
UserVO userVO = getUser();
if (userVO != null) {
Address address = user.getAddress();
if (address != null) {
String postCode = address.getPostCode();
if (postCode != null) {
return postCode;
}
}
}
return "우편번호 없음";
이렇게 Optional 사용하지 않으면 null 체크를 반드시 해야해서 번거로움이 많습니다.
Optional<UserVO> userVO = Optional.ofNullable(getUser());
Optional<Address> address = userVO.map(UserVO::getAddress);
Optional<String> postCode = address.map(Address::getPostCode);
String result = postCode.orElse("우편번호 없음");
// 그리고 위의 코드를 다음과 같이 축약해서 쓸 수 있다.
String result = user.map(UserVO::getAddress)
.map(Address::getPostCode)
.orElse("우편번호 없음");
return result;
String name = getName();
String result = "";
try {
result = name.toUpperCase();
} catch (NullPointerException e) {
throw new CustomUpperCaseException();
}
가독성도 떨어지고 번잡합니다.
Optional<String> nameOpt = Optional.ofNullable(getName());
String result = nameOpt.orElseThrow(CustomUpperCaseExcpetion::new).toUpperCase();
단 두 줄로 표현이 가능합니다.
Optional.of 는 인자로 null 값을 받지 않겠다는 말이며
Optional.ofNullable은 인자로 null이 가능합니다.
String name = null;
Optional<String> opt = Optional.ofNullable(name);
orElse 와 orElseGet의 차이
- orElse: Optional 안의 값이 null이든 아니든 항상 호출된다.
- orElseGet: Optional 안의 값이 null일 경우에만 호출된다.
[ orElse VS orElseGet 사용 정리]
- orElse
- Optional의 값이 null이든 아니든 항상 호출된다.
- 그에 따른 비용이 추가되고, 문제가 발생할 수 있다.
- 값이 미리 존재하는 경우에 사용한다.
- orElseGet
- Optional의 값이 null일 경우에만 호출된다.
- 비용이 orElse보다 저렴하며, 불필요한 문제가 발생하지 않는다.
- 값이 미리 존재하지 않는 거의 대부분의 경우에 orElseGet을 사용하면 된다.
'언어 & 라이브러리 > 자바' 카테고리의 다른 글
[자바] 자바를 사용하는 이유 (0) | 2022.09.23 |
---|---|
[자바] 상속보다 합성을 사용해야 하는 이유 (0) | 2022.09.13 |
[자바] Long 타입 비교를 equals로 해야만 하는 이유 (0) | 2022.09.13 |
[자바] 병렬 처리 컬렉션 (0) | 2022.04.05 |
[자바] Double Brace Initialization (0) | 2022.04.05 |
댓글