Language/Java

15-3. Optional

리져니 2021. 8. 5. 16:17

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
728x90

'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