String userEmail = "Empty";
String result = Optional.ofNullable(userEmail).orElse(getUserEmail());
실행결과
getUserEmail() called
getUserEmail()을 호출
결과값을 orElse()의 매개변수로 전달
orElse실행, value가 null이 아니므로 userEmail값 반환
orElseGet() 사용
String userEmail = "Empty";
String result = Optional.ofNullable(userEmail).orElseGet(() -> getUserEmail());
실행결과
getUserEmail 함수형 인터페이스를 orElseGet()로 전달
orElseGet실행, value가 null이 아니므로 userEmail값 반환
발생할 수 있는 장애 예시
public void findByUserEmail(String userEmail) {
// orElse에 의해 userEmail이 이미 존재해도 유저 생성 함수가 호출되어 에러 발생
return userRepository.findByUserEmail(userEmail)
.orElse(createUserWithEmail(userEmail));
}
private String createUserWithEmail(String userEmail) {
User newUser = new User(userEmail);
return userRepository.save(newUser);
}
위의 예제는 Optional의 단말 연산으로 orElse를 사용하고 있기 때문에, 조회 결과와 무관하게 createUserWithEmail 함수가 반드시 실행된다.
하지만 Database에서는 userEmail이 Unique로 설정되어 있기 때문에 오류가 발생할 것이다.
그렇기 때문에 위와 같은 경우에는 해당 코드를 orElseGet으로 수정해야 한다.
기본형 Optional
IntStream과 같은 기본형 스트림에는 Optional도 기본형을 값으로 하는 OptionalInt, OptionalLong, OptionalDouble을 반환한다. 아래의 목록은 IntStream에 정의된 메서드들이다.
Optional이란?
객체 생성하기
객체의 값 가져오기
Optional 객체에 저장된 값을 가져올 때는 get()을 사용한다.
값이 Null일 때는 NoSuchElementException이 발생한다.
값이 Null일 때를 대비하여 orElse()로 대체할 값을 지정
값이 Null일 때를 대비하여, Null을 대체할 값을 반환하는 람다식을 지정
값이 Null일 때를 대비하여, 지정된 예외를 발생
값이 존재하는지 확인
filter, map, flatMap 사용하기
값이 존재할 때 사용하기
orElse(), orElseGet()의 차이점
준비코드 - getUserEmail()
orElse() 사용
실행결과
userEmail
값 반환orElseGet() 사용
실행결과
userEmail
값 반환발생할 수 있는 장애 예시
기본형 Optional
Reference