Optional<T>와 OptionalInt
1. Optional<T>
- Optional<T>은 지네릭 클래스로 "T타입의 객체"를 감싸는 래퍼 클래스이므로,
모든 타입의 참조변수를 담을 수 있다.
- 최종 연산의 결과를 그냥 반환하는 것이 아니라 Optional객체에 담아서 반환한다.
- 또한 Optional 클래스는 null인지 아닌지 알려주는 정의된 메서드가 포함되어 있다.
public final class Optional<T>{
private final T value; // T타입의 참조변수
...
}
- 아래는 Optional<T> 클래스에 정의된 메서드들이다.
(1) Optional.of() - static
: 해당 객체에 값을 초기화한다.
( ex) Optional.of("abc"), Optional.of(new String("abc")) )
( 만약 참조변수의 값이 null일 가능성이 있으면, ofNullable()을 사용해야 한다. )
(2) Optional.<T>empty() - static
: 참조변수를 기본 값으로 초기화한다.
( null로 초기화가 가능하지만 되도록이면 empty()를 사용하는 것이 바람직하다. )
(3) 참조변수.get()
: 참조변수에 저장된 값을 가져올 때 사용되는 메서드이다.
( 값이 null일 때는 NoSuchElementException이 발생하며, orElse()로 대처할 수 있다. )
( orElse()에 값을 넣으면, 그 값이 반환된다. )
( ex) orElse("10") -> "10"이 리턴 )
( null을 대처할 값을 반환하는 람다식을 지정할 수 있는 orElseGet()이 있다. )
( null일 때 지정된 예외를 발생시키는 람다식을 지정할 수 있는 orElseThrow()가 있다. )
( 사용방법은 아래와 같다. )
String str1 = optVal.orElseGet(String::new); // () -> new String()와 동일
String str2 = optVal.orElseThrow(NullPointerException::new);
(4) filter(), map(), flatMap()
: Stream처럼 Optional<String>이나 Optional<Optional<String>>을 처리할 수 있다.
( 만약 null이면, 이 메서드들은 아무 일도 하지 않는다. )
( 아래의 예시를 보자. )
(5) isPresent()
: Optional 객체의 값이 null이면 false를, 아니면 true를 반환한다.
( 아래의 예시를 보자. )
( 또한 ifPresent()를 사용하여 아래와 같은 코드를 출력할 수 있다. )
( null이 아닐 경우, 괄호() 안에 있는 것이 실행한다. )
( ifPresent() 메서드는 findAny()나 findFirst()와의 최종 연산에 어울린다. )
2. OptionalInt, OptionalLong, OptionalDouble
- Optional 또한 Stream 처럼 기본형 값을 하는 메서드를 지원한다.
- 반환 타입이 Optional<T>가 아니라는 것을 제외하고는 Stream에 정의된 것과 비슷하다.
- 주의할 것은 기본형의 기본값 0인 객체와 Empty()로 초기화 된 기본값 0의 객체는
아래의 예제 코드처럼 서로 같지 않다.
( 참고) Optional 객체에 null을 저장하면, empty() 객체와 똑같다. )
1-1. Optional를 이해하기 위한 예제(1)