Optional 만들기
- Optional.of()
- Optional.ofNullable()
- Optional.empty()
Optional에 값이 있는지 없는지 확인하기
- isPresent()
- isEmpty() (Java 11부터 제공)
Optional에 있는 값 가져오기
- get()
- 만약에 비어있는 Optional에서 무언가를 꺼낸다면?
- NoSuchElementException이 발생
Optional에 값이 있는 경우에 그 값을 가지고 ~~를 하라.
- ifPresent(Consumer)
- 예) Spring으로 시작하는 수업이 있으면 id를 출력하라.
Optional에 값이 있으면 가져오고 없는 경우에 ~~를 리턴하라.
- orElse(T)
- 무조건 호출이 된다.
- 예) JPA로 시작하는 수업이 없다면 비어있는 수업을 리턴하라.
Optional에 값이 있으면 가져오고 없는 경우에 ~~를 하라.
- orElseGet(Supplier)
- 있으면 호출을 안한다.
- 예) JPA로 시작하는 수업이 없다면 새로 만들어서 리턴하라.
Optional에 값이 있으면 가져오고 없는 경우 에러를 던져라.
Optional에 들어있는 값 걸러내기
- Optional filter(Predicate)
Optional에 들어있는 값 변환하기
- Optional map(Function)
- Optional flatMap(Function): Optional 안에 들어있는 인스턴스가 Optional인 경우에 사용하면 편리하다.
예제
public class AppRun {
public static void main(String[] args) throws IllegalAccessException {
List<OnlineClass> springClasses = new ArrayList<>();
springClasses.add(new OnlineClass(1, "spring boot", true));
springClasses.add(new OnlineClass(2, "spring data jpa", true));
springClasses.add(new OnlineClass(3, "spring mvc", false));
springClasses.add(new OnlineClass(4, "spring core", false));
springClasses.add(new OnlineClass(5, "rest api developement", false));
Optional<OnlineClass> optional = springClasses.stream()
.filter(oc -> oc.getTitle().startsWith("spring"))
.findFirst();
// Optional에 값이 있는지 없는지 확인
boolean present = optional.isPresent();
// boolean present = spring.isEmpty();
System.out.println(present);
// 아래에 optional class가 없으면
// NoSuchElementException 이 발생
OnlineClass onlineClasse = optional.get();
System.out.println(onlineClasse.getTitle());
optional.ifPresent(oc -> System.out.println(oc.getTitle()));
// Optional에 값이 있으면 가져오고 없는 경우에 ~~를 리턴하라.
// 무조건 createNewClass을 호출한다.
OnlineClass onlineClasses2 = optional.orElse(createNewClass());
// Optional에 값이 있으면 가져오고 없는 경우에 ~~를 하라.
// 없을 때 createNewClass을 호출한다.
// OnlineClass onlineClasses3 = optional.orElseGet(() -> createNewClass());
OnlineClass onlineClasses3 = optional.orElseGet(() -> createNewClass());
OnlineClass onlineClasses4 = optional.orElseGet(AppRun::createNewClass);
// Optiona에 값이 있으면 가졍고 없는 경우 에러를 던져라.
// OnlineClass onlineClasses5 = optional.orElseThrow(() -> {
// return new IllegalStateException();
// });
OnlineClass onlineClasses5 = optional.orElseThrow(IllegalStateException::new);
// Optional에 들어있는 값 걸러내기
Optional<OnlineClass> OnlineClass6 = optional
.filter(oc -> !oc.isClosed());
System.out.println(OnlineClass6.isPresent());
// Optional에 들어있는 값 변환하기
// Optional안에 optional값이 있따면 복잡하게 아래와같이 꺼내야 한다.
Optional<Optional<Progress>> progress = optional.map(OnlineClass::getProgress);
Optional<Progress> progress1 = progress.orElseThrow(IllegalStateException::new);
progress1.orElseThrow(IllegalStateException::new);
// 복잡한 위의 방법을 개선한 메소드
Optional<Progress> progress2 = optional.flatMap(OnlineClass::getProgress);
Optional<Optional<Progress>> progress2_2 = optional.map(OnlineClass::getProgress);
Optional<Progress> progress2_3 = progress2_2.orElseThrow(IllegalStateException::new);
}
private static OnlineClass createNewClass() {
System.out.println("새로 만들었땅 @@");
return new OnlineClass(10, "new Class",false);
}
}