ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Optional API
    백기선(인프런 강의)/더 자바, Java 8 2020. 7. 12. 13:13
    반응형

    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에 값이 있으면 가져오고 없는 경우 에러를 던져라.

    • orElseThrow()

     

    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);
    	}
    }
    반응형

    '백기선(인프런 강의) > 더 자바, Java 8' 카테고리의 다른 글

    자바 Concurrent 프로그래밍 소개  (0) 2020.07.16
    Date와 Time API  (0) 2020.07.12
    Optional 소개  (0) 2020.07.11
    Stream API  (0) 2020.07.11
    Stream 소개  (0) 2020.07.09
Designed by Tistory.