2020-10-20 백기선님 더자바8 강의정리 Optional

Optional

  • 자바8에 추가된 인터페이스
  • 오직 한개의 값이 있을수도 있고 null이 있을수도 있다.
if (obj != null ) {
  ...logic
}

return Optional.of(obj);
return Optional.ofNullable(obj);
  • null체크에 대한 부분을 자주 빠뜨려서 NullPointException을 발생시킬 수 있다.

  • null을 return하는게 문제

  • 비어있는 값이 전달될 수 있으면 Optional<Obj>형식으로 리턴한다.

  • 메서드에서 작업 중 제대로 리턴할 수 없을 때

    • 예외를 던진다(비싸다, StackTrace를 찍기때문)
    • Null을 리턴
    • Optional을 리턴한다.
  • 주의점

    • 리턴값으로만 쓰자.(Map Key, 매개변수, 인스턴스 필드의 타입으로 쓰지말자)
    • Optional을 리턴하는 메서드에 null을 리턴하지 말자.
    • Primitive는 Optional이 따로 있다. OptionalInt, OptionalLong… => Optional을 쓰면 Boxing, UnBoxing이 일어나서 비싸다.

Optional API

  • 만들기

    • Optional()
    • Optional.ofNullable()
    • Optional.empty()
  • Optional값이 있는지 없는지 확인

    • isEmpty() => java11부터 제공
    • isPresent()
  • Optional에 있는 값 가져오기

    • get()
  • Optional에 값이 있는 경우 ~을 해라

    • ifPresent(Consumer)
  • Optional에 값이 있으면 가져오고 없으면 ~을 리턴

    • orElse(T)

    • public class Java8App {
        public static void main(String[] args) {
          System.out.println("====================Optional====================");
          Optional<Book> findBook = bookList.stream()
            .filter(book -> book.getTitle().startsWith("Algorithm"))
            .findFirst();
          Book book = findBook.orElse(createNewBook());
          System.out.println(book.getTitle());
        }
      
        private static Book createNewBook() {
          System.out.println("create book class");
          return new Book(6, "Algorithm Book", "알고리즘", true, 1000);
        }
      }
      
  • Optional에 값이 있으면 가져오고 없으면 ~을 해라

    • orElseGet(Supplier)

    • public class Java8App {
        public static void main(String[] args) {
          System.out.println("====================Optional====================");
          Optional<Book> findBook = bookList.stream()
            .filter(book -> book.getTitle().startsWith("Algorithm"))
            .findFirst();
          Book book = findBook.orElseGet(Java8App::createNewBook);
          System.out.println(book.getTitle());
        }
      }
      
  • Optional에 값이 있으면 가져오고 없으면 에러

    • orElseThrow()

    • Book book = findBook.orElseThrow(IllegalAccessException::new);
      
  • Optional에 들어있는 값 걸러내기

    • Optional.filter(Predicate) => 값이 있다는 전제하에 동작. 리턴타입은 Optional
  • Optional에 들어있는 값 변환하기

    • Optional map(Function)
    • Optional flatMap(Function): Optional 안에 들어있는 인스턴스가 Optional인 경우에 사용하면 편리
Written on October 20, 2020