지네릭 클래스로 T타입의 객체 를 감싸는 래퍼 클래스이다.
optional타입의 객체에는 모든 타입의 참조 변수를 담을수 있다.
null을 직접 다루는건 위험 -> optional객체에 담아서 사용.
Stream 최종 연산의 결과를 그냥 반환하는 게 아니라 Optional객체에 담아서 반환 하는 것이다. 이러면 반환된 결과가 null인지 매번 if문으로 체크하는 대신Optional에 정의된 메서드를 통해서 간단히 처리 가능 하다.
stream처럼 Optional 객체에도 filter(), map() , flatMap() 를 사용 할수있다.
of() 또는 ofNullable()을 사용한다.
참조변수의 값이 null일 가능성이 있으면 of() 대신에 ofNullable()를 사용해준다.of()는 NullPotinException 발생하기 때문이다.
String str = "Abc"
Optinal<String> optVal=Optional.of(str);
Optional<String> optVal=Optional.ofNullable(null)
Optional<String> optVal=Optional.empty(); //초기화
Optinal<String> optVal=Optional.of("abc");
String str1=optVal.get();
String str2=optVal.orElse("");
isPresent() 는 Optional 객체의 값이 null 이면 false를 아니면 true를 반환
ifPresent(Consumber<T.>block) 은 값이 있으면 주어진 람다식 실행 /없으면 아무일도 하지 않는다.
ifPresent()는 Optional<T> 를반환하는 findAny() 나 findFirst() 와 같은 최종연산과 잘 어울린다.
Optional<T> findAny()
Optional<T> findFirst()
Optional<T> max()
Optional<T> min()
Optional<T> redyce()
OptionalInt findAny()
OptionalInt findFirst()
OptionalInt reduce(IntBinaryOperator op)
OptionalInt max()
OptionalInt min()
OptionalInt average()
IntStream 과 같이 Optional도 기본형을 값으로 하는 것들이 있다.
IntStream 에 정의된 메서드들이다.
반환타입이 Optional<T.>가 아닌것을 제외 하고는 Stream에 정의된 것과 비슷하다.
Optional<T> ->T get()
OptionalInt -> getAsInt()
OptionalLong -> getAsLong()
OptionalDouble -> getAsDouble()
OptionalInt opt = OptionalInt.of(0); //OptionalInt 에 0을저장
OptionalInt opt2 = OptionalInt.empty();//OptionalInt 에 0을저장
-> isPresent로 구별하자!