OptionalXXX 클래스
java.util 패키지의 Optional, OptionalDouble, OptionalInt, OptionalLong 클래스 타입을 일컫는다.
이들은 값을 저장하는 값 기반 클래스로, 이 객체에서 값을 얻기 위해서는 get(), getAsDouble(), getAsInt(), getAsLong()을 호출한다.
Optional은 값이 들어 있을수도, 없을 수도 있는 컨테이너
return 값에만 사용을 권장
Optional을 return 하는 메소드에서 null을 return하지말자. (empty()를 사용)
Collection, Map, Stream, Array, Optional을 Optional로 감싸지 말자. (이미 null값을 판단 가능)
다음과 같은 코드에서, 컬렉션의 요소가 추가되지 않아서 저장 된 요소가 없으면?
List<Integer> list = new ArrayList<>(); double avg = list.stream() .mapToInt(Integer :: intValue) .average() .getAsDouble(); System.out.println("평균" + avg);
요소가 없으므로, 평균값도 있을 수 없다 👉 NoSuchElementException 예외 발생
이럴 경우! 예외를 피하는 세 가지 방법
1. Optional 객체를 얻어 isPresent() 메소드로 평균값 여부를 확인. isPresent가 True일때만 return
2. orElse() 메소드로 디폴트값을 정해놓는다. 평균값이 없으면 orElse()의 매개값이 디폴트 값
3. ifPresnet() 메소드로 평균값이 있을 경우에만 값을 이용하는 람다식 실행
import java.util.ArrayList;
import java.util.List;
import java.util.OptionalDouble;
public class OptionalExample {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
/*//예외 발생(java.util.NoSuchElementException)
double avg = list.stream()
.mapToInt(Integer :: intValue)
.average()
.getAsDouble();
*/
//방법1
OptionalDouble optional = list.stream()
.mapToInt(Integer::intValue)
.average();
if (optional.isPresent()) {
System.out.println("방법1_평균: " + optional.getAsDouble());
} else {
System.out.println("방법1_평균: " + 0.0);
}
//방법2
double avg = list.stream()
.mapToInt(Integer::intValue)
.average()
.orElse(0.0);
System.out.println("방법2_평균: " + avg);
//방법3
list.stream()
.mapToInt(Integer::intValue)
.average()
.ifPresent(a -> System.out.println("방법3_평균: " + a));
}
}
결과
방법1 평균 : 0.0
방법2 평균 : 0.0