Optional 클래스는 단순히 집계 값만 저장하는 것이 아니라, 집계값이 존재하지 않을 경우 디폴트값을 설정할 수도 있고, 집계 값을 처리하는 Consumer를 등록할 수도 있다.

Optional은 Wrapper 클래스이기에 값이 있을 수도 있고 없을 수도 있는데 Optional.empty() 를 사용해 Null인 값을 생성해줄 수 있다.
Optional<String> opt = Optional.emptu();
System.out.println(opt); //Optional.empty 출력
어떤 데이터가 Null이 아니라면 Optional.of()를 사용해 생성할 수 있다. 만약 Optional,of()를 사용해 Null을 저장하려고 하면 NullPointerExceptioin 예외가 발생한다.
Optional<String> opt = Optional.of("onegyeol");
만약 어떤 데이터가 Null일수도, 아닐수도 있는 경우에는 Optional.ofNullvale()을 사용한다. 그리고 이후에 값이 없는 경우에 대비해 orElse() 혹은 orElseGet() 메서드를 사용해 안전하게 값을 가져올 수 있도록 한다.
Optional<String> opt = Optional.ofNullavle(getName());
String name = opt.orElse("nothing");
컬렉션의 요소는 동적으로 추가되는 경우가 많다.
List<Integer> lis = new ArrayList<>();
double avg = list.stream()
.mapToINT(Integer :: intValue)
.average()
.getAsDouble();
System.out.println("평균 : " + avg);
만약 컬렉션의 요소가 추가되지 않아 저장된 요소가 없을 경우 위의 코드는 요소가 없기에 NoSuchElementException 예외가 발생한다.
요소가 없을 경우 예외를 피할 수 있는 방법은 세가지가 있다.
Optional 객체를 얻어 isPresent() 메서드 사용하기isPresent() 메서드가 true를 반환할 때만 getAsDouble() 메서드로 평균값을 얻으면 된다.OptionalDouble opt = list.stream()
.mapToINT(Integer :: intValue)
.average();
if(optional.isPresent()){
System.out.println("평균 : " + opt.getAsDouble());
} else{
System.out.println("평균 : 0.0");
}
orElse() 메서드로 디폴트 값 정해놓기orElse() 의 매개값이 디폴트값이 된다.double avg = list.stream()
.mapToInt(Integer :: intValue)
.average()
.orElse(0.0);
System.out.println("평균 : "+ avg);
ifPrsent() 메소드로 평균값이 있을 경우에만 계산list.stream()
.mapToInt(Integer :: intValue)
.average()
.ifPresent(a -> System.out.println("평균 : " + a));
참고
티스토리 : https://mangkyu.tistory.com/70
서적 : 이것이 자바다