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