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 |