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