Optional
java ·null이 아닌 값을 포함하거나 포함하지 않을 수 있는 컨테이너 객체
Optional 이전에 null 처리
예외를 던진다. (비용이 비싸다, stackTrace를 찍기 때문이다.)
null을 리턴한다. (클라이언트는 코드를 주의해서 사용해야한다.)
Optional 이후
optional로 Null 처리를 강제하기 때문에 NullPointerException이 발생 빈도가 준다.
사용시 주의점
리턴값으로만 써야한다.
이외에 방법으로 사용하면 Optional 자체에 null이 들어가 null 체크를 다시 해줘야한다.
예륻 들어 매개변수로 쓰면 null을 설정하는게 가능, Map의 키값으로 쓰면 키가 null일 수도 있음, 인스턴스 필드로 쓰면 필드자체가 null일 수 있음
Optional이 리턴타입이면 null을 반환하면 안된다.
Optional 사용 이유가 없다, 빈값을 리턴하고 싶으면 Optioanl.empty()를 반환한다.
기본형 Optional은 따로 있다.
OptionalInt, OptionalLong 등
기본 Optional을 사용하면 기본형은 오토박싱 언박싱이 자주 일어나므로 성능에 안좋다.
오토박싱은 int -> Integer, 언박싱은 Integer -> int
Collection, Map, Stream Araay, Optional로 감싸지 말것
Optional이 없어도 빈값을 판단할 수 있는 컨테이너격의 객체들이기 때문에 감싸도 의미가 없다.
Optioanl 생성메소드
Optioanl of(T t)
null인 값이 들어오면 NullPointerException을 발생시킨다.
Optioanl ofNullable(T t)
null인 값이 들어올 수 있다.
Optioanl empty() 빈값
값 확인 메소드
boolean isPresent()
값이 있으면 true 없으면 false를 반환
boolean isEmpty() // java11
값이 있으면 false, 없으면 true
값 조회 메소드
T get()
값 리턴, 확인 필요
값 처리 메소드
void ifPresent(Consumer action)
값이 있으면 메소드 실행
T orElse(T other)
값이 있으면 반환, 없으면 other 반환
other에 메소드가 들어가면 그 메소드는 항상 실행한다.
예제
Optional.empty().orElse(build()); // optional이 빈값이어도 build()가 실행된다.
String item = optional.orElse(build());
System.out.println(item);
T orElseGet(Supplier supplier)
값이 있으면 반환, 없으면 supplier 실행
T orElseThrow(Supplier execptionSupplier)
T orElseThrow()
값이 없을때 던지고 싶은 예외를 execptionSupplier에서 던지면 된다.
값이 없고, 매개변수가 없으면 NoSuchElementExecption을 던진다.
예제
Optional.empty().orElseThrow(IllegalArgumentException::new);
Optional<T> filter(Predicate predicate)
조건에 맞는 값이 있으면 값 반환, 없으면 빈 Optional을 반환한다.
예제
Optional<String> item = optional.filter(s->s.startsWith("A"));
<U> Optioanl<U> map(Function<T, U> mapper)
mapper의 리턴값을 Optional에 담아서 반환, 없으면 빈 Optional을 반환한다.
예제
Optional<String> optional = Optional.of("apple");
optional.map(String::toUpperCase).ifPresent(System.out::println); // APPLE
Optional flatMap(Function<T, Optional mapper) mapper의 리턴값이 Optional일 경우에만 사용하며, Optional 값을 한번 까준다.
예제
Optional<Optional<String>> optional = Optional.of(Optional.of("apple"));
optional.flatMap(Optional::get).ifPresent(System.out::println); // apple