Optional 클래스
Optional?
Optional<T>
Integer 혹은 Double과 같이 객체 T를 포장(wrap)해주는 래퍼 클래스입니다.
자바의 NullPointException(NPE)을 조금 더 세련되게 처리할 수 있도록 도와줍니다.
객체 생성
of() 메소드나 ofNullable() 메소드를 통해 객체를 생성합니다.
타입에는 <T> / int / long / double 등이 있습니다.
Optional<T> : 객체 T
OptionalInt : int
OptionalLong : long
OptionalDouble : double
of( )
null이 아닌 명시된 값을 가지는 Optional 객체를 반환합니다.
만약 of() 메소드를 통해 생성된 Optionla 객체에 null이 저장되면 NPE가 발생합니다.
ofNullable( )
명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하고,
만약 null인 경우에는 비어있는 Optional 객체를 반환합니다.
Optional<String> obj = Optional.ofNullable("Optional 객체");
System.out.println(obj.get()) // 실행결과 : Optional 객체
객체 접근
Optional 객체의 값을 얻기 위해서는 아래와 같은 메소드들을 호출합니다.
get() : 객체 T
getAsInt() : int
getAsLong() : long
getAsDouble() : double
하지만 객체 접근 전에 null 여부 판단이 선행되어야 안전하게 값을 가져올 수 있습니다.
다음과 같은 메소드들을 활용해 null 여부를 판단합니다.
isPresent( )
값의 존재 여부를 판단해 true 혹은 false를 반환합니다.
OptionalDouble optional = stream.average();
if(optional.isPresent()) {
System.out.println("평균 : " + optional.getAsDouble());
} else {
System.out.println("평균 : 0.0");
}
// 하지만 이와 같이 여부를 판단하는 것은 지양해야 하는 패턴인 '안티패턴'으로 불림
// ifPresent() 메소드를 활용하기를 권장
orElse( )
저장된 값이 없다면 인자로 전달된 default 값을 반환합니다.
orElse(T) : 객체 T
orElse(int) : int
orElse(long) : long
orElse(double) : double
// 집계값이 없다면 avg는 default 값인 0.0
double avg = stream.average().orElse(0.0);
orElseGet( )
저장된 값이 없을 경우 인자로 전달된 람다 표현식의 결과를 반환합니다.
orElseThrow( )
저장된 값이 없을 경우 인자로 전달된 예외를 발생시킵니다.
ifPresent( )
제공된 Comsumer 람다식을 저장된 값이 있을 경우에만 실행시킵니다.
리턴 타입은 void입니다.
// 집계 값이 있는 경우 출력문 실행
stream.average().ifPresent(a -> System.out.println("평균 : " + a));
* refs
https://www.tcpschool.com/java/java_stream_optional