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
서적 : 이것이 자바다