- ๋ฐ์ดํฐ์ null๊ฐ์ ์ฒ๋ฆฌํด์ค์ผ ํ ๋ NullPointerException(NPE)๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํด์ฃผ๊ธฐ ์ํด ์ฌ์ฉ
Optional ์์ฑ
Optional ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ๋ฉ์๋
- of() : ๋ณ์value์ ๊ฐ์ด null์ธ ๊ฒฝ์ฐ NPE ๋ฐ์ํจ → ๋ฐ๋์ ๊ฐ์ด ์์ด์ผ ํ๋ ๊ฒฝ์ฐ์ of()๋ฅผ ์ฌ์ฉ
Optional<String> optional = Optional.of(value);
- ofNullable() : ๋ณ์value์ ๊ฐ์ด null ์ผ์ ์๊ฒ ์ค์ → ๋ณ์๊ฐ null์ธ ๊ฒฝ์ฐ Optional.empty()๊ฐ ๋ฆฌํด๋จ
Optional<String> optional = Optional.ofNullable(value);
- empty() : ๋น Optional ๊ฐ์ฒด๋ฅผ ์์ฑ → Optional ๊ฐ์ฒด ์์ฒด๋ ์์ง๋ง ๋ด๋ถ์์ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๊ฐ ์์(Optional.empty() ๊ฐ์ฒด๋ ๋ฏธ๋ฆฌ ์์ฑ๋ Singleton ๊ฐ์ฒด)
Optional<String> optional = Optional.empty();
Optioanl ์ค๊ฐ์ฒ๋ฆฌ ๋ฉ์๋
- Optional ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์์ ์ฒ๋ฆฌํ ๋ค์ Optional๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ค์ Optional ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฉ์๋
- filter() : ํํฐ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ๋๋ค์์ด ์ฐธ์ด๋ฉด, Optional๊ฐ์ฒด๋ฅผ ํต๊ณผ์ํค๊ณ , ๊ฑฐ์ง์ด๋ฉด Optional.empty()๋ฅผ ๋ฐํํด์ ์ถ๊ฐ๋ก ์ฒ๋ฆฌ๊ฐ ์๋๋๋ก ํ๋ ๋ฉ์๋
Optional.of("ABCD").filter(v -> v.startsWith("AB")).orElse("Not AB");
Optional.of("XYZ").filter(v -> v.startsWith("AB")).orElse("Not AB");
“ABCD” ์ ๊ฒฝ์ฐ, ํํฐ ์กฐ๊ฑด์ธ “AB”๋ก ์์ํ๋ฏ๋ก “ABCD”๊ฐ ๋ฆฌํด๋๋ค.
“XYZ”์ ๊ฒฝ์ฐ ํํฐ ์กฐ๊ฑด์ธ “AB”๋ฅผ ๋ง์กฑํ์ง ๋ชปํ๋ฏ๋ก “Not AB”๊ฐ ๋ฆฌํด๋๋ค.
- map() : Optional๊ฐ์ฒด์ ๊ฐ์ ์์ ์ ํด์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณํํด์ค
Optional.of("XYZ").map(String::toLowerCase).orElse("Not AB");
Optional ์ต์ข ์ฒ๋ฆฌ ๋ฉ์๋
- ์ค๊ฐ ์ฒ๋ฆฌ ๋ฉ์๋๋ค์ Optional๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ์ง๋ง, ์ต์ข ์ฒ๋ฆฌ ๋ฉ์๋๋ค์ ๊ฐ์ ๋ฆฌํดํด์ Optional ๋ฉ์๋ ์ฒด์ธ์ ๋๋ด๋ ๋ฉ์๋ ์ด๋ค.
- ifPresent() : ๋๋ค์์ ์ธ์๋ก ๋ฐ์์, ๊ฐ์ด ์กด์ฌํ ๋ ๊ทธ ๊ฐ์ ๋๋ค์์ ์ ์ฉํด ์ค, Optional๊ฐ์ฒด์ ๊ฐ์ด ์์ผ๋ฉด ๋๋ค์ ์คํX
Optional.of("TEST").ifPresent(System.out::println); // TEST์ถ๋ ฅ
Optional.ofNullable(null).ifPresent(System.out::println); // ์๋ฌด๊ฒ๋ ์ถ๋ ฅ๋์ง ์์
- isPresent() : Optional ๊ฐ์ฒด์ ๊ฐ์ด null์ธ์ง์ ์ฌ๋ถ๋ฅผ ํ๋จํด์ค
Optional.of("TEST").isPresent(); // True์ถ๋ ฅ
Optional.of("TEST").filter(v -> "Not Equals".equals(v)).isPresent(); // false
filter๋ฉ์๋์์ Optional.empty() ๋ฉ์๋๋ฅผ ๋ฐํํด์ isPresent()์์ false๋ฅผ ๋ฐํ.
- get() : Optional ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ value๊ฐ์ ๊ฐ์ง๊ณ ์จ๋ค. Optional ๊ฐ์ฒด์ ๊ฐ์ด ์๋ ์ฐ,NoSuchElementException์ด ๋ฐ์
Optional.of("TEST").get(); // TEST ๋ฆฌํด
Optional.ofNullable(null).get(); // NoSuchElementException
- orElse() : ์ค๊ฐ์ฒ๋ฆฌ ๋ฉ์๋๋ค์ ๊ฑฐ์น๋ฉด์ Optional ๊ฐ์ฒด๊ฐ ๋น์ด ์์๋ค๋ฉด, orElse() ๋ฉ์๋์ ์ง์ ๋ ๊ฐ์ด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ฆฌํด๋๋ค.
Optional.of("XYZ").filter(v -> v.startsWith("AB")).orElse("Not AB") //"Not AB" ๋ฆฌํด
- orElseGet() : orElse๋ฉ์๋์ ์ธ์๋ฅผ ํญ์ ์ธ์ํ๊ณ ์๊ธฐ๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋น์ฉ์ด ํฌ๋ค๋ฉด orElse()๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ค. ๋์ orElseGet() ๋ฉ์๋๋ Optional๊ฐ์ฒด๊ฐ ๋น์ด์๋ ๊ฒฝ์ฐ์๋ง Supplierํจ์๋ฅผ ์คํํ๋ค. ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋น์ฉ์ด ํฌ๋ค๋ฉด orElseGet() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
Optional.of("TEST").filter(v -> v.startWith("AB")).orElseGet(() -> "Not AB");
- orElseThrow() : ์ฒ์๋ถํฐ Optional๊ฐ์ฒด๊ฐ ๋น์ด์๊ฑฐ๋, ์ค๊ฐ์ฒ๋ฆฌ๋ฅผ ๊ฑฐ์น๋ฉด์ ๊ฐ์ฒด๊ฐ ๋น์ด์๋ค๋ฉด Supplierํจ์๋ฅผ ์คํํด ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
Optional.of("XYZ").filter(v -> v.startWith("AB")).orElseThrow(NoSuchElementException::new);
์ฐธ์กฐ : https://hbase.tistory.com/212
๋ฐ์ํ