Optional
Optional 은 Java8 부터 도입된 기능이고, NullPointerException 을 방지하도록 도와줍니다.
String 변수가 null 인 상황, DB에서 데이터를 조회를 했지만 결과값이 없는 상황에서 원하는 다음 처리(메서드)를 실행할 경우 NPE를 경험할 수 있습니다.
package java.util;
public final class Optional<T> {
private final T value;
private Optional(T value) {
this.value = value;
}
public boolean isPresent() {
return value != null;
}
public boolean isEmpty() {
return value == null;
}
...
Optional<T>
는 Null이 올 수 있는 값을 감싸는 Wrapper 클래스입니다.
Optional을 생성자를 사용하여 value
변수에 값을 넣고, 추가 메서드로 value가 null 인지 체크를 하기 때문에 NPE를 방지할 수 있습니다.
메서드
get()
public T get() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}
get()
메서드를 사용하면 Optional 객체에서 value
를 바로 접근해서 사용할 수 있습니다.
그러나 value
의 값이 비어 있다면, NoSuchElementException
예외가 발생하게 됩니다.
Java 문서에는 (각자가 정의한 예외 처리를 하도록) orElseThrow()
가 대안이라고 작성되어 있습니다.
ifPresentOrElse(action, emptyAction)
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction) {
if (value != null) {
action.accept(value);
} else {
emptyAction.run();
}
}
ifPresentOrElse value가 null 인지, 아닌지에 따라 모두 처리할 수 있는 메서드입니다.
luckyDraw.ifPresentOrElse(
prizeMoney -> System.out.println("lucky"),
() -> System.out.println("Take a rain check..")
);
Optional.of
public static <T> Optional<T> of(T value) {
return new Optional<>(Objects.requireNonNull(value));
}
//Objects.java
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
Optional.of 는 value 를 Optional 객체로 래핑하는 메서드입니다. 만약 value 의 값이 null 이면 NPE 가 발생합니다.
Optional.ofNullable
private static final Optional<?> EMPTY = new Optional<>(null);
public static <T> Optional<T> ofNullable(T value) {
return value == null ? (Optional<T>) EMPTY
: new Optional<>(value);
}
Optional.ofNullable 은 Optional.of 처럼 Optional 객체로 래핑합니다. 다른점은 null 인 경우도 허용합니다.
orElse
public T orElse(T other) {
return value != null ? value : other;
}
value 값이 null 이면 other 인자 값을 갖고, 아니면 value 값을 사용하는 메서드입니다.
orElseGet
public T orElseGet(Supplier<? extends T> supplier) {
return value != null ? value : supplier.get();
}
value 값이 null 이면 supplier 메서드로부터 반환된 값을 갖고, 아니면 value 값을 사용하는 메서드입니다.
orElse vs orElseGet
언뜻 보면 같은 기능을 하는 것처럼 보이지만 주의할 점이 있습니다.
orElse는 orElseGet과 달리 인자로 값을 필요로 합니다.
따라서 orElse는 호출되기 전에 인자의 값이 무엇인지를 알고 있어야 합니다.
그런데 인자가 메서드라면 값을 리턴하는 로직을 실행해야 합니다.
orElse 는 orElseGet과 달리 null 여부를 판단하지 않고 인자로 사용된 메서드를 우선적으로 실행합니다.
orElseThrow
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (value != null) {
return value;
} else {
throw exceptionSupplier.get();
}
}
value 값이 null 이면 exceptionSupplier 인자로 예외처리를 하는 메서드입니다.
'Java' 카테고리의 다른 글
소나 큐브 사용법(Sonar Qube) (0) | 2023.11.29 |
---|---|
Lombok (1) | 2023.11.28 |
Java Stream 최종 처리 (0) | 2023.09.14 |
Java Stream 중간 처리 (0) | 2023.09.14 |
Java List (0) | 2023.09.14 |