Optional<T>
제네릭 클래스로 T타입 객체를 감싸는 래퍼클래스(Wrapper Class)이다. 그래서 Optional타입의 객체에는 모든 타입의 참조변수를 담을 수 있다.
* 최종 연산의 결과를 Optional객체에 담아서 반환한다.
- null을 직접 다루는 것은 위험(NullPointerExceptiom 예외가 발생할수 있음) 하기 때문에 Optional을 사용한다.
- null을 직접 다룰때 nullCheck를 해줘야 하는데, 코드가 지저분해 진다.
:: 간결하고 안전한 코드 작성이 가능해진다.
Optional 객체 생성: of(), ofNullable()
예제
String str = "abc":
Optional<String> optVal = Optional.of(str);
Optional<String> optVal = Optional.of("abc");
Optional<String> optVal = Optional.of(new String("abc"));
만일 참조변수의 값이 null일 가능성이 있다면, of()대신 ofNullable()을 사용해야 한다.
* of()는 매개변수의 값이 null이면 NullPointerException이 발생함
Optional<String> optVal = Optional.ofNullable(null);
Optioanl<T>타입의 참조변수를 기본값으로 초기화할 때는 empty()를 사용한다. null로 초기화하는 것이 가능하지만, empty()로 초기화 하는 것이 바람직하다.
Optional<String> optVal = null; //null로 초기화
Optional<String> optVal = Optional.<String>.empty(); //빈 객체로 초기화
Optional 객체의 값 가져오기: get(), orElse()
Optional객체에 저장된 값을 가져올 때는 get()을 사용한다. 값이 null일 때는 NoSuchElementException이 발생하며, 이를 대비해서 orElse()로 대체할 값을 지정할 수 있다.
예제
Optional<String> optVal = Optional.of("abc");
String str1 = optVal.get(); // optVal에 저장된값을 반환. null이면 예외 발생
String str2 = optVal.orElse(::); // optVal에 저장된 값이 null일 때는 ""를 반환
orElse()의 변형으로 null을 대체할 값을 반환하는 람다식을 지정하는 orElseGet()과, null일때 지정된 예외를 발생시키는 orElseThrow()가 있다.
예제
String str1 = optVal.orElseGet(String::new); // () -> new String();과 동일
String str2 = optval.orElseThrow(NullPointerException::new); // null인경우 예외 발생시킴
Stream처럼 Optional 객체에도 filter(), map(), flatMap()을 사용할 수 있다.
* map()의 연산결과가 Optional<Optional<T>>일떄, flatMap()을 사용하면 Optioanl<T>를 결과로 얻게된다.
예제
int result = Optional.of("123")
.filter(x -> x.length() >0 )
.map(Integer::parseInt).orElse(-1); // result = 123
result = Optional.of("")
.filter(x -> x.length() > 0)
.map(Integer::parseInt).orElser(-1); // result = -1
기본형 Optional: OptionalInt, OptionalLong, OptionalDouble
IntStream과 같은 기본형 스트림에는 Optional도 기본형을 값으로 하는 OptionalInt, OptionalLong, OptionalDouble을 반환한다.
Optional 클래스 | 메서드 |
OptionalInt | findAny() |
OptionalInt | findFirst() |
OptionalInt | reduce(IntBinaryOperator op) |
OptionalInt | max() |
OptionalInt | min() |
OptionalDouble | average() |
기본형 Optional에 저장된 값을 꺼낼때 사용하는 메서드
Optional클래스 | 값을 반환하는 메서드 |
Optional<T> | (반환 형태: T) get() |
OptionalInt | (반환 형태: int) getAsInt() |
OptionalLong | (반환 형태: long) getAsLong() |
OptionalDouble | (반환 형태: double) getAsDouble() |
빈 Optional객체와의 비교
OptionalInt opt = OptionalInt.of(0);
OptionalInt opt = OptionalInt.empty();
System.out.println(opt.isPresent()); //true
System.out.println(opt2.isPresent()); //false
System.out.println(opt.equal(opt2)); //false
'Language > Java' 카테고리의 다른 글
15-4(2). 스트림의 최종 연산 - Collect (0) | 2021.08.05 |
---|---|
15-4(1). 스트림의 최종 연산 (0) | 2021.08.05 |
15-2. 스트림의 중간 연산 (0) | 2021.08.05 |
15-1. 스트림 만들기 (0) | 2021.08.04 |
15. 스트림(stream) (0) | 2021.08.04 |