https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
Optional <T> ๊ฐ์ฒด๋?
Java 8 ์์ ๋์ ๋ Wrapper ํด๋์ค์ด๋ค.
null ๊ฐ์ ์ฒ๋ฆฌํ๋๋ฐ ๋์์ ์ค๋ค. (NPE ๋ฅผ ๋ฐฉ์งํ๋ค. `NullPointException`)
- ๊ฐ์ด ์์ ์ ์๋ ๊ฒฝ์ฐ์ Optional ์ฌ์ฉํ์ฌ ํํ๊ฐ๋ฅ
- `๊ฒฐ๊ณผ ์์` , `๋น๊ฒฐ๊ณผ` ๋ฅผ ๋ช
ํํ ํํํ๋ ์ฉ๋
(์ด์ ์ null ์ ์ฌ์ฉํ๋๋ฐ null ์ ์ฌ์ฉํ๋ฉด NPE ๊ฐ ๋ฐ์ํ๋ฉด์ ํ๋ก๊ทธ๋จ์ด ์ฃฝ์ด๋ฒ๋ฆผ) - JPA ์์ ์ฃผ๋ก ์ฌ์ฉ๋๋ค
Optional ์ฃผ์์ฌํญ
- Optional ๋ณ์์๋ null ํ ๋น ํ์ง ์๊ธฐ
- Optional ์ ํด๋์ค ํ๋ ํ์ ์ผ๋ก ์ฌ์ฉ ํ์ง ์๊ธฐ -> ๊ฐ์ฒด ๊ทธ๋๋ก ์ฌ์ฉ ์ด ์ณ์
- ๋ฉ์๋ ์ธ์๋ก Optional ์ฌ์ฉ ํ์ง ์๊ธฐ -> ๊ฐ์ฒด ๊ทธ๋๋ก ์ฌ์ฉ์ด ์ณ์
- ๋น ์ปฌ๋ ์ , ๋ฐฐ์ด์ OPtional ์ฌ์ฉํ์ง ์๊ธฐ -> ๋น ์ปฌ๋ ์ ์ ๋ฆฌํดํ๋๊ฒ ์ณ์
- ์์ํ์ ๊ฐ์ Optional ํด๋์ค๊ฐ ์๋ OptionalInt , OptionalLong ... ํด๋์ค ์ฌ์ฉํ๋๊ฒ ์ฑ๋ฅ๋ช ์์ ์ข๋ค.->๋ฐ์ฑ ์ธ๋ฐฉ์์ด ์ผ์ด๋๋ฉด์ ์ฑ๋ฅ ์ ํ
Optional ์ฌ์ฉ
Optional<String> optional = Optional.empty();
Optional<String> opt = Optional.of("hello");
String temp = null;
Optional<String> opt = Optional.ofNullable(temp);
Optional ๊ฐ์ฒด๊ฐ ์ ๊ณตํด์ฃผ๋ ๋ฉ์๋
- empty () `public static <T> Optional<T> empty()`
Optional<String> emptyOptional = Optional.empty();
๋น `Optional` ๊ฐ์ฒด ๋ช ์์ ์์ฑ
- of () `public static <T> Optional<T> of (T value)`
Optional <String> optionalValue = Optional.of("hello");
null ๊ฐ์ด ์๋๋ผ๊ณ ํ์ ํ ๋ ์ฌ์ฉํ๋ค.
null ์ ๋ฐ์ผ๋ฉด NPE ๋ฐ์
- ofNullable ()
Optional<String> optionalValue = Optional.ofNullable(null);
Optional<String> optionalValue2 = Optional.ofNullable("World");
๊ฐ์ด null ์ผ ์๋ ์์ ๋ ์ฌ์ฉ
๊ฐ์ด null ์ด๋ฉด `๋น Optional ๊ฐ์ฒด`๋ฅผ ๋ฐํํ๋ค.
- get () `public T get()`
Optional<String> optional = Optional.of("Hello");
System.out.println(optional.get()); // "Hello"
// Optional<String> emptyOptional = Optional.empty();
// System.out.println(emptyOptional.get()); // ์์ธ ๋ฐ์
๊ฐ์ด ์กด์ฌํ๋ฉด ๊ฐ์ ๋ฐํ
์กด์ฌํ์ง ์์ผ๋ฉด `NoSuchElementException` ๋ฐ์
!! ๊ฐ์ด ํญ์ ์กด์ฌํ๋ค๊ณ ํ์คํ ๋๋ง ์ฌ์ฉํ๋ค. !!
- isPresent () `public boolean isPresent()`
Optional<String> optional = Optional.of("Test");
System.out.println(optional.isPresent()); // true
Optional<String> emptyOptional = Optional.empty();
System.out.println(emptyOptional.isPresent()); // false
๊ฐ์ด ์กด์ฌํ๋ฉด true , ๊ทธ๋ ์ง ์์ผ๋ฉด false
- ifPresent () `public void ifPresent(Consumer<? super T> consumer`
Optional<String> optional = Optional.of("Hello");
optional.ifPresent(value -> System.out.println("Value: " + value)); // "Value: Hello"
๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ ๊ณต๋ Consumer ์คํ
- filter()
`public Optional<T> filter(Predicate<? super T> predicate)
๊ฐ์ด ์กด์ฌํ๊ณ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด Optional ๋ฐํ
์๋๋ผ๋ฉด ๋น Optonal ๋ฐํ
- map() `public <U> Optional<U> map(Function<? super T,? extends U> mapper)`
๊ฐ์ด ์กด์ฌํ๋ฉด ๋งคํํจ์ (Function) ์ ์ฉ ๊ฒฐ๊ณผ `์ผ๋ฐ ๊ฐ or ๊ฐ์ฒด`๋ฅผ ๋ฐํํ๊ณ
์ต์ข ์ ์ผ๋ก๋ Optional ๋ก ๊ฐ์ธ์ ธ์ ๋ฐํ
- flatMap
๋งคํํจ์๊ฐ Optional ์ ๋ฐํํ ๋ ์ฌ์ฉ (๋งคํํจ์ ๊ฒฐ๊ณผ๋ถํฐ Optional ์)
Optional<<>> ์ ์ค์ฒฉ๋์ง ์๊ณ Optional<R> ๋ก ๋ง๋ค์ด์ง
- orElse() `public T orElse(T other)`
๊ฐ์ด ์กด์ฌํ๋ฉด ๊ฐ์ ๋ฐํ , ์๋๋ฉด ๊ธฐ๋ณธ๊ฐ ๋ฐํ
- orElseGet() `public T orElseGet(Supplier<? extends T> other)`
๊ฐ์ด ์กด์ฌํ๋ฉด ๊ฐ์ ๋ฐํ , ์๋๋ฉด `Supplier` ์ฌ์ฉํด ๋์ ๊ฐ ์์ฑ
- orElseThrow()
`public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X`
๊ฐ์ด ์กด์ฌํ์ง์์ผ๋ฉด ์ฌ์ฉ์์ ์ ์์ธ ๋ฐ์
- equals()
`public boolean equals(Object obj)`
- hashCode()
`public int hashCode()`
- toString()
`public String toString()`