자바/스트림

Optional<T>와 OptionalInt

백_곰 2022. 4. 15. 11:25

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)