Holy Moly 2022. 3. 27. 22:59

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);