Optional은 NullPointException 발생 방지를 위해 사용 Java8
Optional<T>
는 null 이 올 수 있는 값을 감싸는 Wrapper 클래스
기존에는 if문을 사용해서 null 체크
List<String> list = store.get("itemName");
if ( list == null) {
log.info("없는 상품");
// 처리
}
public final class Optional<T> {
/**
* 빈 optional을 공통객체로서 가지고 있다.
*/
private static final Optional<?> EMPTY = new Optional<>(null);
/**
* null이 아닐 경우 값이 담기고, null 일 경우null 이 담긴다.
*/
private final T value;
// 생성자
private Optional(T value) {
this.value = value;
}
}
public static<T> Optional<T> empty() {
@SuppressWarnings("unchecked") // 컴파일 경고를 사용하지 않도록 설정
Optional<T> t = (Optional<T>) EMPTY;
return t;
}
공통 객체로 갖고 있는 빈 optional을 반환한다.
public static <T> Optional<T> of(T value) {
return new Optional<>(Objects.requireNonNull(value));
}
null 체크
value 가 null이면 requireNonNull()에서 NPE을 던진다.
public static <T> Optional<T> ofNullable(T value) {
return value == null ? (Optional<T>) EMPTY : new Optional<>(value);
}
null일 가능성이 있는 value를 파라미터로 넘긴다.
null
: Optional EMPTY
를 반환 , (빈 공통 객체)
non-null
: new Optional<>(value)
반환
public boolean isPresent() {
return value != null;
}
ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {
if (value != null) {
action.accept(value);
} else {
emptyAction.run();
}
}
처음 파라미터는 Optional 객체에 값이 null이 아닐때 실행되는 Consumer 를 받고,
두 번째 파라미터는 Optional 객체의 값이 null일 때 실행되는 Runnable을 받는다.
둘다 함수형 인터페이스이기에 람다식이 가능하다.
public T orElse(T other) {
return value != null ? value : other;
}
Optional이 null 이 아니면 value 반환
null 이라면 파라미터로 들어온 other을 그대로 반환
orElseGet(Supplier<? extends T> supplier)
public T orElseGet(Supplier<? extends T> supplier) {
return value != null ? value : supplier.get();
}
Supplier 라는 함수형 인터페이스가 있기에 람다식을 사용할 수 있다.
값이 Optonal 에 있으면 value를 반환,
없으면 Supplier 에서 생성된 결과 반환
public T orElseThrow() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
OPtional에 값이 있으면 반환
없으면 NoSuchElementException
을 던진다.
반환타입으로 값이 있는지 여부를 확인하기 위해 탄생했다.
map, filter 등 많이 있다 필요할 때 찾아서 사용하자
[ 올바른 Optional 사용법 가이드 ]
출처: https://mangkyu.tistory.com/203 [MangKyu's Diary:티스토리]