Optional API
Optional 만들기
● Optional.of()
● Optional.ofNullable()
● Optional.empty()
System.out.println(Optional.of(1).isPresent());
System.out.println(Optional.ofNullable(null).isPresent());
System.out.println(Optional.empty().isPresent());
Optional에 값이 있는지 없는지 확인하기
● isPresent()
● isEmpty() (Java 11부터 제공)
List<OnlineClass> springClasses = new ArrayList<>();
springClasses.add(new OnlineClass(1, "spring boot", true));
springClasses.add(new OnlineClass(5, "rest api development", false));
Optional<OnlineClass> spring = springClasses.stream()
.filter(oc -> oc.getTitle().startsWith("spring"))
.findFirst();
boolean present = spring.isPresent();
System.out.println(present);
Optional에 있는 값 가져오기
● get()
● 만약에 비어있는 Optional에서 무언가를 꺼낸다면??
OnlineClass onlineClass = spring.get();
System.out.println(onlineClass.getTitle());
// 존재하지 않는 경우
Optional<OnlineClass> jpa = springClasses.stream()
.filter(oc -> oc.getTitle().startsWith("jpa"))
.findFirst();
NoSuchElementException 에러 발생
Optional에 값이 있는 경우에 그 값을 가지고 ~~를 하라.
● ifPresent(Consumer)
● 예) Spring으로 시작하는 수업이 있으면 id를 출력하라.
// Optional API 이용
spring.ifPresent(oc -> System.out.println(oc.getId()));
spring.ifPresent(oc -> System.out.println(oc.getTitle()));
Optional에 값이 있으면 가져오고 없는 경우에 ~~를 리턴하라.
● orElse(T)
● 예) JPA로 시작하는 수업이 없다면 비어있는 수업을 리턴하라.
// spring
OnlineClass onlineClass = spring.orElse(createNewClass());
System.out.println(onlineClass.getTitle());
System.out.println("============");
// jpa
onlineClass = jpa.orElse(createNewClass());
System.out.println(onlineClass.getTitle());
private static OnlineClass createNewClass() {
System.out.println("create new online class");
return new OnlineClass(10,"jpa new class", false);
}
spring으로 시작하는 수업은 존재하기 때문에 실행후 기존 것을 가져왔고
jpa로 시작하는 수업은 없기 때문에 새로 만든 것을 리턴
Optional에 값이 있으면 가져오고 없는 경우에 ~~를 하라.
● orElseGet(Supplier)
● 예) JPA로 시작하는 수업이 없다면 새로 만들어서 리턴하라.
// spring
OnlineClass onlineClass = spring.orElseGet(() -> createNewClass());
System.out.println(onlineClass.getTitle());
System.out.println("============");
// jpa
onlineClass = jpa.orElseGet(() -> createNewClass());
System.out.println(onlineClass.getTitle());
spring으로 시작하는 수업은 존재하기 때문에 기존 것을 가져오고
jpa로 시작하는 수업은 없기 때문에 새로 만든 것을 리턴
Optional에 값이 있으면 가져오고 없는 경우 에러를 던져라.
● orElseThrow()
onlineClass = jpa.orElseThrow(IllegalStateException::new);
System.out.println(onlineClass.getTitle());
값이 없기 때문에 에러를 던짐
Optional에 들어있는 값 걸러내기
● Optional filter(Predicate)
// 필터에 해당이 되면 동작
Optional<OnlineClass> optional = jpa.filter(oc -> !oc.isClosed());
System.out.println(optional.isEmpty());
jpa로 시작되는 수업이 열려있는것이 없기 때문에
isEmpty()는 true를 리턴
Optional에 들어있는 값 변환하기
● Optional map(Function)
● Optional flatMap(Function): Optional 안에 들어있는 인스턴스가 Optional인 경우에 사용하면 편리하다.
// map
Optional<Optional<Progress>> progress = optional.map(OnlineClass::getProgress);
Optional<Progress> progress1 = progress.orElse(Optional.empty());
// flatmap
Optional<Progress> progress2 = optional.flatMap(OnlineClass::getProgress);