Published 2022. 9. 8. 17:45

Optional 에는 orElse() 라는 메소드와 orElseGet() 이라는 메소드가 있다.

둘 다 Optional 을 통해 가져온 값이 null 일 때는 해당 값을 반환하라는 메소드다.

 

 

orElse 와 orElseGet

/**
 * Return the value if present, otherwise return {@code other}.
 *
 * @param other the value to be returned if there is no value present, may
 * be null
 * @return the value, if present, otherwise {@code other}
 */
public T orElse(T other) {
  return value != null ? value : other;
}

/**
  * Return the value if present, otherwise invoke {@code other} and return
  * the result of that invocation.
  *
  * @param other a {@code Supplier} whose result is returned if no value
  * is present
  * @return the value if present otherwise the result of {@code other.get()}
  * @throws NullPointerException if value is not present and {@code other} is
  * null
  */
public T orElseGet(Supplier<? extends T> other) {
  return value != null ? value : other.get();
}

간단하게 보면 두 메소드 다 value 가 null 이면 other 을 return 하는 형태이다.

 

차이가 있다면 orElse() 의 경우에는 T 타입의 other 을 그대로 반환해주는 역할을 하고, orElseGet() 의 경우에는 Supplier 의 인터페이스를 통해 그 인터페이스의 결과(?) 를 반환한다고 볼 수 있습니다.

 

  • orElse 메소드는 해당 값이 null 이든 아니든 관계없이 항상 불린다.
  • orElseGet 메소드는 해당 값이 null 일 때만 불린다.
return value != null ? value : other; // orElse(T other)
return value != null ? value : other.get(); // orElseGet(Supplier<? extends T> other)

 

복사했습니다!