Optional<T>
2023. 6. 8. 11:09ㆍ기타
T타입의 객체를 감싸는 래퍼 클래스
public final class Optional<T> {
private final T value;
....
}
매번 if문으로 반환된 결과가 null인지 매번 if문으로 체크하는 대신 간단히 처리 가능
Optional 객체 생성
Optional 객체를 생성할 때는 of, ofNullable를 사용한다
String str = "yongcha";
// str이 null이면 nullpointerException 모야 그럼 왜씀.. 알아봐야함 null을 받을 수 없음
Optional<String> value1 = Optional.of(str);
// str이 null이어도 ""을 반환
Optional<String> value2 = Optional.ofNullable(str); null 가능 ex) Optional.ofNullable(null);
Optional 값 가져오기
value2.get() // 값이 null일 시 NoSuchElementException 거의 사용X
value2.orElse() // 값이 null일때 반환할 값을 지정가능 value2.orElse("empty") 문자열 empty 반환
value2.orElseGet() // orElse를 람다로 표현가능 () -> {} 코드블럭을 사용하기 때문에 로직 사용 가능
value2.orElseThrow() // 값이 null일때 던질 Exception을 핸들링 가능 람다 사용 () => {}
Optional 값 체크
value2.isPresent() // true false boolean 값으로
value2.ifPresent() // 값이 있으면 실행하는 로직 () => {} 람다 표
Optional 사용 시 주의점
- Optional 변수에 절대 null 할당 금지
Optional<YongUser> findById(Long id) {
if(result == 0) {
// return null; (x)
return Optional.empty(); (o)
}
- 값이 있는 경우에 이를 사용하고 없는 경우에 아무 동작도 하지 않는다면, Optional.ifPresent()를 활용할 것
findById(4).ifPresent((user) -> System.out.println(user.getName()))
- Optional에서 컬렉션(list, map, set….)을 사용하지 말 것
Optional<List<YongUser>> users; (x)
- 기본 타입의 Optional에는 OptionalInt, OptionalLong, OptionalDouble 사용을 고려할 것
OptionalInt maybeInt = OptionalInt.ofNullable(1);
OptionalLong maybeInt = OptionalLong.ofNullable(1L);
OptionalDouble maybeDouble = OptionalDouble.ofNullable(1.0);
- Optional은 return 타입에만 사용할 것
public Optional<YongUser> findById(Optional<Yonguser> yonguser) {
..
} (x)
public Optional<Yonguser> findById(YonguserDTO bean) {
..
} (o)
public class YongUserDTO {
private Optional<username> username; (x)
public YongUserDTO(Optional<username> username) {
this.username = username
} (x)
}
Optional 사용법 예시
public String findPostCode() {
UserVO userVO = getUser();
if (userVO != null) {
Address address = user.getAddress();
if (address != null) {
String postCode = address.getPostCode();
if (postCode != null) {
return postCode;
}
}
}
return "우편번호 없음";
}
public String findPostCode() {
String result = user.map(UserVO::getAddress)
.map(Address::getPostCode)
.orElse("우편번호 없음");
}
위에 코드를 아래의 코드로 축약 할 수 있다.
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();
이 역시 아래 코드로 축약 가능
'기타' 카테고리의 다른 글
ajax blob 타입 받기 (0) | 2023.09.26 |
---|---|
java lambda 람다표현식 (0) | 2023.06.08 |
intellj 단축기 정리 (windows) (0) | 2023.04.12 |