java 8 Optional
Optional을 사용하기 위해서는 선언해주어야 합니다.
empty()
empty() 메소드는 일반적으로 사용되는 비어있는 Optional 객체를 생성합니다.
Optional |
이 경우 비여있는 옵셔널 객체인 Optional.empty() 입니다.
이와 같이 예제를 작성해보면
결과는 "이름" 이라고 출력이 됩니다. 이 "이름"은 Optional 형 객체입니다.
ofNullable()
ofNullable() 메소드를 이용하여 Optional 객체를 생성 할 수 있습니다. 이 메소드는 null이 아닐 경우에는 위에 예제처럼 name이라는 Optional 객체를 반환하고, null이면 비어있는 Optional 객체를 반환하게 됩니다.
of()
값이 null인 경우 NPE 예외를 던지게 됩니다. 값이 꼭 있어야 하는 경우에 사용하면 됩니다.
get()
그리고 get() 메소드를 통해 Optional 객체에 접근이 가능합니다.
get() 메소드는 Optional에 값이 있으면 값을 반환하고, 그렇지 않으면 NoSuchElementException을 throw합니다.
isPresent()
이 메소드는 값이 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
이 메소드를 통해서 name이라는 Optional 객체가 null인지 검사를 하여 get()으로 가져 올 수 있습니다.
Optional |
Sring |
String 이라는 값(객체)이 있는 Optional 객체입니다.
ifPresent()
위에 isPresent() 예제를 보면 if문을 사용하여 값이 있는지 없는지를 확인하는데 ifPresent() 메소드를 사용하면
이렇게 값이 있으면 print문이 실행이 된다.
"이름" 이라는 값이 있기 때문에 결과는 이렇다.
orElse() / orElseGet()
orElse()와 orElseGet() 사용법은 예제와 같습니다. null 일 경우에 "default"를 반환 하고 그렇지 않으면 값을 그대로 반환합니다.
orElse()는 public T orElse(T other) 로 object T가 전달 된다. value != null ? value : other; 이런 형태라고 보면 된다.
위의 예제처럼 name1 == null 이니 other인 "default"가 반환 된 것이다. 값을 전달하기 위한 것이다.
orElseGet()는 public T orElseGet(Supplier<? extends T> other) 에 형태로 Supplier이 파라미터로 전달된다.
value != null ? value : other.get(); 이런 형태라고 보면 된다.
이처럼 orElse()는 value() 메소드를 호출한다. orElseGet()는 value() 메소드를 호출 하지 않는다. 값이 비어있는 경우에 orElseGet()은 메소드를 호출한다.
orElse() 는 있는 경우 값을 반환하고, 그렇지 않으면 다른 값을 반환한다.
orElseGet() 는 있는 경우 값을 반환하고, 그렇지 않으면 다른것을 호출하고 해당 호출의 결과를 반환한다.
method1(method2())이 실행되면 method2()는 method1()보다 먼저 그리고 언제나 실행된다. 따라서 orElse(test)에서도 test가 먼저 실행되는 것이 당연하다.
orElseGet(Supplier)에서 Supplier는 Optional에 값이 없을 때만 실행된다. 따라서 Optional에 값이 없을 때만 새 객체를 생성하거나 새 연산을 수행하므로 불필요한 오버헤드가 없다.
filter() map() flatMap() orElseThrow() 등 메소들 들이 더 있습니다.
'Back-End > JAVA' 카테고리의 다른 글
자바8 - 인터페이스의 기본 메소드와 스태틱 메소드 (0) | 2021.04.08 |
---|---|
자바 indexOf() - 문자열 중 해당문자 위치 찾기 (0) | 2021.04.07 |
자바 charAt(int i) -'0' 에 대해서 문자를 정수형으로? (0) | 2021.04.05 |
자바8 - 함수형 인터페이스와 람다 표현식에 대해서 간단하게 (0) | 2021.04.04 |
== 와 equals 차이 (0) | 2020.12.21 |