Optional์ ์๋ฐ 8์์ ์ถ๊ฐ๋ ํด๋์ค๋ก, Null-safeํ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ ํด๋์ค์ด๋ค.
๊ธฐ์กด Java ์์๋ null ์ฒ๋ฆฌ๋ฅผ ์ํด null ์ฒดํฌ๋ฅผ ์์ฃผ ํด์ค์ผ ํ์ง๋ง, Optional์ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ๊ฐ๋จํ ์ฒ๋ฆฌํ ์ ์๋ค.
Optional ํด๋์ค๋ null์ผ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๋ Wrapper ํด๋์ค์ด๋ฉฐ, ํด๋น ๊ฐ์ฒด๊ฐ null์ด๋ฉด empty, null์ด ์๋๋ฉด ํด๋น ๊ฐ์ฒด๋ฅผ ๋ด์ Optional ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
Optional์ ์ฃผ์ ๋ฉ์๋
Optional.of(value)
value๊ฐ null์ด ์๋๋ฉด value๋ฅผ ๊ฐ์ผ Optional ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
value๊ฐ null ์ด๋ฉด NullPointerException ์์ธ๊ฐ ๋ฐ์ํ๋ค.
Optional.ofNullable(value)
value๊ฐ null์ด ์๋๋ฉด value๋ฅผ ๊ฐ์ผ Optional ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
value๊ฐ null ์ด๋ฉด empty Optional ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
Optional.empty()
๋น์ด ์๋ Optional ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
get()
Optional ๊ฐ์ฒด ์์ ์๋ ๊ฐ์ ๋ฐํํ๋ค.
๊ฐ์ด ์๋ ๊ฒฝ์ฐ NoSuchElementException ์์ธ๊ฐ ๋ฐ์ํ๋ค.
isPresent()
Optional ๊ฐ์ฒด๊ฐ ๋น์ด์๋์ง ์ฌ๋ถ ๋ฅผ ํ์ธํ๋ค.
ifPresent(Consumer<T> consumer)
Optional ๊ฐ์ฒด ์์ ๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ ์ธ์๋ก ๋ฐ์ ์ฒ๋ฆฌํ๋ Consumer๋ฅผ ์คํ ํ๋ค.
orElse(T other)
Optional ๊ฐ์ฒด ์์ ๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ ๋ฐํํ๋ค.
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ์ธ์๋ก ์ ๋ฌ๋ ๊ธฐ๋ณธ๊ฐ(other)์ ๋ฐํํ๋ค.
orElseGet(Supplier<? extends T> supplier)
Optional ๊ฐ์ฒด ์์ ๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ ๋ฐํํ๋ค.
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ ๋์ฒด ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํด supplier์ get() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋์ฒด ๊ฐ์ ๋ฐํํ๋ค.
map(Function<T, R> mapper)
Optional ๊ฐ์ฒด ์์ ์๋ ๊ฐ์ ์ธ์๋ก ๋ฐ์ ์ฒ๋ฆฌํ๋ ํจ์(mapper)๋ฅผ ์ ์ฉํ๊ณ , ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ ๋ฅผ Optional ๊ฐ์ฒด๋ก ๋ฐํํ๋ค.
flatMap(Function<T, R> mapper)
Optional ๊ฐ์ฒด ์์ ์๋ ๊ฐ์ ์ธ์๋ก ๋ฐ์ ์ฒ๋ฆฌํ๋ ํจ์(mapper)๋ฅผ ์ ์ฉํ๊ณ , ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๋ฅผ Optional ๊ฐ์ฒด๋ก ๋ฐํํ๋ค.
์ด ๋ mapper์ ๊ฒฐ๊ณผ๋ Optional ๊ฐ์ฒด์ด๋ค.
import java .util .Optional ;
public class OptionalExample {
public static void main (String [] args ) {
String inputString = "Hello World" ;
Optional <String > optionalString = Optional .ofNullable (inputString );
optionalString .map (String ::length )
.filter (len -> len <= 5 )
.ifPresentOrElse (
System .out .println ,
() -> System .out .println ("Too long" )
);
}
}
๋ฌธ์์ด์ ์
๋ ฅ์ผ๋ก ๋ฐ์ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ 5 ์ดํ์ธ ๊ฒฝ์ฐ ํด๋น ๋ฌธ์์ด์ ์ถ๋ ฅํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ "Too long" ์ด๋ผ๋ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ์์ ์์ค
orElse()์ orElseGet() ์ฐจ์ด์
๋ณดํต orElse()๋ null ์ฌ๋ถ์ ์๊ด์์ด ๋์ํ๊ณ , orElseGet()์ null ์ผ ๋์๋ง ๋์ํ๋ค๊ณ ์๋ ค์ ธ ์๋ค.
Optional ํด๋์ค์ ๋ด๋ถ์์ ๋ฉ์๋๋ฅผ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
return value != null ? value : other ; // orElse(T other)
return value != null ? value : other .get () // orElseGet(Supplier<? extends T> supplier)
orElseGet(Supplier<? extends T> supplier) ๋ฉ์๋๋ value๊ฐ null ์ด๋ฉด other์ ๋ฐ๋ก ์คํํ์ง ์๊ณ other.get()์ ์คํํ๋ค.
๋ฐ๋ผ์ null์ด ์๋ ๋๋ ์คํ๋์ง ์๋ ๊ฒ
public T orElse (getAnyName ()) {
return value != null ? value : getAnyName ();
}
public String getAnyName () {
return "anyName" ;
}
๋ง์ฝ ์์ ๊ฐ์ด orElse(T other) ์์ other์ด ๋ฉ์๋์ผ ๊ฒฝ์ฐ๋ฅผ ๋ณด๋ฉด
getAnyName() ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๋ฌธ์์ด์ธ "anyName" ๊ฐ์ด T ์ ๋ค๋ฆญ ๋ณ์์๊ฒ ํ์ํ๊ธฐ ๋๋ฌธ์ ์ฐ์ getAnyName() ๋ฉ์๋๋ฅผ ์คํํ๊ฒ ๋๋ค.
๊ทธ๋์ null ์ฌ๋ถ์ ์๊ด์์ด ๋์ํ๋ค๋ ์๋ฏธ