JAVA/JAVA

Optional

호두밥 2021. 11. 7. 16:35

Optional Class

Optional 클래스는 스트림에서 Null Pointer Exception을 피할 수 있도록 도와주는 클래스입니다. 

Optional<MyClass>로 특정 클래스를 감싸서 사용합니다. 이렇게 하면 Optional 클래스 안에 MyClass가 담겨있는 모양이 됩니다. 

① Null 값이 들어온 경우 Null을 대체할 수 있는 Default 값을 설정할 수 있습니다.

② 값이 없을 경우에는 Optional을 Null이 아닌 Empty 상태로 반환하여 처리합니다.

 

private Optional<Soundcard> soundcard;  
public Optional<Soundcard> getSoundcard() { ... }

Optional 객체 생성하기

① emtpy : Empty 상태로 Optional 객체를 생성하기

Optional<MyClass> sc = Optional.empty();

② of : null인 객체를 허용하지 않는 Optional을 생성하기

of를 이용해 optional을 생성할 때는 매개변수에 null은 들어갈 수 없습니다. 매개변수가 null인 경우에는 null pointer exception이 발생합니다.

MyClass myclass = new MyClass();
Optional<MyClass> sc = Optional.of(myclass);

③ ofNullable : null인 객체를 허용하는 Optional을 생성하기

ofNullable을 이용해 Optional을 생성할 때는 매개변수에 null이 들어갈 수 있습니다. 매개변수가 null인 경우에는 empty상태인 optional 객체가 생성됩니다.

MyClass myclass = null;
Optional<MyClass> sc = Optional.ofNullable(myclass);

Optional 메소드

isEmpty

Optional 객체에 값이 저장되어 있지 않으면 True, 저장되어 있으면 false를 반환합니다.

isPresent 

Optional 객체에 값이 저장되어 있으면 true, 저장되어 있지 않으면 false를 반환하는 메소드입니다.

Optional<String> string = Optional.of(new String("123"));
if(string.isPresent()){
  System.out.println(string.get());
}

 

Consumer 람다를 매개변수로 받아 저장되어 있는 값이 있는 경우, Consumer가 처리하도록 할 수 있습니다.

Optional<String> string = Optional.of(new String("123"));
string.ifPresent(System.out::println);

orElse

값이 저장되어 있지 않을 경우 디폴트 값을 지정하는 메소드입니다.  

Optional<Integer> integer = null;
Optional<Integer> integerOptional = Optional.empty();
System.out.println("integerOptional.orElse(100) = " + integerOptional.orElse(100));

스트림을 사용할 때 orElse를 이용해 null인 경우 default값을 합산하도록 구현할 수 있습니다.

list.stream().mapToInt(Integer::intValue).sum().orElse(0);

orElseThrow

값이 null인 경우 Exception을 발생시키는 메소드입니다.

String string = null;
String name = Optional.ofNullable(string)
		                  .orElseThrow(IllegalArgumentException::new);

get

Optional 객체의 내부 요소를 꺼내는 메소드입니다.

Optional<String> string = Optional.of("optional");
String optional = opt.get();

filter

Optional 객체의 내부 요소가 특정 조건에 맞는지를 확인하는 메소드입니다.

Optional<Integer> integerOptional = Optional.of(1234);
boolean biggerThan1000 = integerOptional.filter(y -> y > 1000).isPresent();

map

Optional 객체의 내부요소를 다른 객체로 변환시켜 처리하는 메소드입니다.

Optional<String> stringOptional = Optional.of("1234");
boolean biggerThan1000 = stringOptional.map(Integer::parseInt)
								.filter(y -> y > 1000).isPresent();

참조

신용권, 이것이 자바다, 한빛미디어

https://www.baeldung.com/java-optional

https://www.oracle.com/technical-resources/articles/java/java8-optional.html

 

 

'JAVA > JAVA' 카테고리의 다른 글

I/O  (0) 2022.02.06
인터페이스  (0) 2021.11.30
스트림 Stream  (0) 2021.11.07
Comparator와 Comparable  (0) 2021.10.29
Lambda Expressions 람다식  (0) 2021.10.28