korjun1993 / cs-book-study

책을 읽고 토론하며 컴퓨터과학을 공부하는 공간
0 stars 1 forks source link

Optional #43

Open korjun1993 opened 1 year ago

korjun1993 commented 1 year ago

Optional이란?

public final class Optional<T> {

  // If non-null, the value; if null, indicates no value is present
  private final T value;

  ...
}


객체 생성하기


객체의 값 가져오기


orElse(), orElseGet()의 차이점

준비코드 - getUserEmail()

private static String getUserEmail() {
    System.out.println("getUserEmail() called");
    return "korjun1993@tistory.com";
}


orElse() 사용

String userEmail = "Empty";
String result = Optional.ofNullable(userEmail).orElse(getUserEmail());

실행결과

getUserEmail() called
  1. getUserEmail()을 호출
  2. 결과값을 orElse()의 매개변수로 전달
  3. orElse실행, value가 null이 아니므로 userEmail값 반환


orElseGet() 사용

String userEmail = "Empty";
String result = Optional.ofNullable(userEmail).orElseGet(() -> getUserEmail());

실행결과

  1. getUserEmail 함수형 인터페이스를 orElseGet()로 전달
  2. 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

OptionalInt findAny()
OptionalInt findFirst()
OptionalInt reduce(IntBinaryOperator op)
OptionalInt max()
OptionalInt min()
OptionalInt average()
Optional 클래스 값을 반환하는 클래스
Optional T get()
OptionalInt int getAsInt()
OptionalLong long getAsLong()
OptionalDouble double getAsDouble()

Reference