|
| 1 | +## μμ΄ν
55. μ΅μ
λ λ°νμ μ μ€ν νλΌ |
| 2 | + |
| 3 | +### μ΄λ λ©μλκ° κ°μ λ°νν μ μμ λ? |
| 4 | + |
| 5 | +- μλ°8 μ΄μ μ.. |
| 6 | + |
| 7 | + 1. μμΈλ₯Ό λμ§λ€ |
| 8 | + |
| 9 | + But.. |
| 10 | + |
| 11 | + - μμΈλ μ§μ§ μμΈμ μΈ μν©μμλ§ μ¬μ©ν΄μΌ νλ€ |
| 12 | + - μμΈλ₯Ό μμ±ν λ μ€ν μΆμ μ 체λ₯Ό μΊ‘μ³νλ―λ‘ λΉμ©μ΄ ν¬λ€ |
| 13 | + |
| 14 | + 2. nullμ λ°ννλ€ |
| 15 | + |
| 16 | + But.. |
| 17 | + |
| 18 | + - `null`μ λ°ννλ λ©μλλ₯Ό νΈμΆν λλ λ³λμ `null`μ²λ¦¬ μ½λλ₯Ό μΆκ°ν΄μΌ νλ€ -> μ ν μκ΄μλ μ½λμ NPEκ° λ°μν μ μλ€ |
| 19 | + |
| 20 | +- μλ°8 μ΄νμ `Optional` |
| 21 | + |
| 22 | +### `Optional<T>`λ? |
| 23 | + |
| 24 | +- μμλ₯Ό μ΅λ 1κ° κ°μ§ μ μλ λΆλ³ 컬λ μ
|
| 25 | +- `null`μ΄ μλ Tνμ
μ°Έμ‘°λ₯Ό νλ λ΄κ±°λ("λΉμ§ μμλ€") μ무κ²λ λ΄μ§ μμ μ μλ€("λΉμλ€") |
| 26 | +- 보ν΅μ Tλ₯Ό λ°νν΄μΌ νμ§λ§ νΉμ 쑰건μμλ μ무κ²λ λ°ννμ§ μμμΌ ν λ Tλμ `Optional<T>`λ₯Ό λ°ννλλ‘ μ μΈνλ©΄ λλ€ |
| 27 | +- μ₯μ |
| 28 | + - μ΅μ
λμ λ°ννλ©΄ μμΈλ₯Ό λμ§λ κ²λ³΄λ€ μ μ°νκ³ μ¬μ©νκΈ° μ½λ€. |
| 29 | + - `null`μ λ°ννλ κ²λ³΄λ€ μ€λ₯κ°λ₯μ±μ΄ μ λ€ |
| 30 | + |
| 31 | +### `Optional`μ μμ±νλ λ² |
| 32 | + |
| 33 | +- `Optional.empty()` : λΉ μ΅μ
λ |
| 34 | +- `Optional.of(value)` : κ°μ΄ λ μ΅μ
λ (valueμ `null`μ λ£μΌλ©΄ NPEλ₯Ό λμ§λ€) |
| 35 | +- `Optional.ofNullable(value)` : valueκ° `null`μ΄λ©΄ λΉ μ΅μ
λ |
| 36 | +- μ΅μ
λμ λ°ννλ λ©μλμμλ μ λλ‘ `null`μ λ°ννμ§ λ§μ. |
| 37 | + |
| 38 | +### μΈμ nullμ λ°ννκ±°λ μμΈλ₯Ό λμ§λ κ²λ³΄λ¨ `Optional`μ λ°ννλ κ² λ μ’μκΉ? |
| 39 | + |
| 40 | +- λ°νκ°μ΄ μμμλ μμμ API μ¬μ©μμκ² λͺ
νν μλ €μ£Όκ³ μΆμλ |
| 41 | +- ν΄λΌμ΄μΈνΈμκ² λΉ μ΅μ
λμΌλμ νλμ μ μνλλ‘ κ°μ νκ³ μΆμλ |
| 42 | + |
| 43 | +### μ΅μ
λμ λ°ννλ λ©μλλ₯Ό μ¬μ©νλ ν΄λΌμ΄μΈνΈμμλ.. |
| 44 | + |
| 45 | +```java |
| 46 | +public class Person { |
| 47 | + private final String name; |
| 48 | + private final int age; |
| 49 | + // μμ±μ, getter μλ΅ |
| 50 | +} |
| 51 | +``` |
| 52 | + |
| 53 | +```java |
| 54 | +//μΈμμ μ무κ²λ μ£Όμ΄μ§μ§ μμΌλ©΄ λΉ μ΅μ
λ λ°ν, μ£Όμ΄μ§λ©΄ ageκ° κ°μ₯ ν° Personμ λ΄μ μ΅μ
λ λ°ν |
| 55 | +public Optional<Person> pickOldest(Person... people) { |
| 56 | + return Arrays.stream(people) |
| 57 | + .max(Comparator.comparingInt(Person::getAge)); |
| 58 | +} |
| 59 | +``` |
| 60 | + |
| 61 | +1. κΈ°λ³Έκ°μ μ ν΄λ μ μλ€ |
| 62 | + |
| 63 | + ```java |
| 64 | + Person oldest = pickOldest(person1, person2, person3) |
| 65 | + .orElse(new Person("κΈ°λ³Έμ΄λ¦", 0)); |
| 66 | + ``` |
| 67 | + |
| 68 | + ```java |
| 69 | + //κΈ°λ³Έκ°μ μμ±νλ λΉμ©μ΄ ν° κ²½μ° orElseGetμ μ¬μ©ν μλ μλ€ |
| 70 | + Person oldest = pickOldest(person1, person2, person3) |
| 71 | + .orElseGet(() -> new Person("κΈ°λ³Έμ΄λ¦", 0)); |
| 72 | + ``` |
| 73 | + |
| 74 | +2. μνλ μμΈλ₯Ό λμ§ μ μλ€ |
| 75 | + |
| 76 | + ```java |
| 77 | + Person oldest = pickOldest(person1, person2, person3) |
| 78 | + .orElseThrow(() -> new RuntimeException()); |
| 79 | + ``` |
| 80 | + |
| 81 | + μ€μ μμΈκ° μλλΌ ν©ν°λ¦¬λ₯Ό 건λΈμΌλ―λ‘ μμΈκ° μ€μ λ‘ λ°μνμ§ μλλ€λ©΄ μμΈ μμ± λΉμ©μ λ€μ§ μλλ€ |
| 82 | + |
| 83 | +3. κ°μ΄ μ±μμλ€κ³ κ°μ νκ³ κ·Έλ₯ κ°μ κΊΌλΈλ€ |
| 84 | + |
| 85 | + ```java |
| 86 | + Person oldest = pickOldest(person1, person2, person3).get(); |
| 87 | + ``` |
| 88 | + |
| 89 | + λΉ μ΅μ
λμ΄λΌλ©΄ `NoSuchElementException`μ΄ λ°μνλ€ |
| 90 | + |
| 91 | +4. κ·Έ μΈμλ `filter`, `map`, `flatMap`, `ifPresent` λ± μ¬λ¬ λ©μλλ μλ€ |
| 92 | + |
| 93 | +### `isPresent()`λ λλΆλΆμ κ²½μ° λ€λ₯Έ λ©μλλ‘ λ체 κ°λ₯νλ€ |
| 94 | + |
| 95 | +κ°μ₯ λμ΄λ§μ μ¬λμ μ΄λ¦μ μΆλ ₯νκ³ μΆμλ.. |
| 96 | + |
| 97 | +```java |
| 98 | +Optional<Person> oldest = pickOldest(person1, person2, person3); |
| 99 | + |
| 100 | +//not good |
| 101 | +System.out.println("κ°μ₯ λμ΄λ§μ μ¬λμ? " + (oldest.isPresent() ? oldest.get().getName() : "κ²°κ³Όμμ")); |
| 102 | +//good |
| 103 | +System.out.println("κ°μ₯ λμ΄λ§μ μ¬λμ? " + (oldest.map(p -> p.getName()).orElse("κ²°κ³Όμμ"))); |
| 104 | +``` |
| 105 | + |
| 106 | +`isPresent()` ν `get()` νλκ²λ³΄λ¨ `map()`μ μ¬μ©νλκ² λ μ§§κ³ λͺ
ννκ³ μ©λ²μ λ§λ€. |
| 107 | + |
| 108 | +### μ΅μ
λμ μ€νΈλ¦Ό |
| 109 | + |
| 110 | +`Stream<Optional<T>>`μμ μ±μμ§ μ΅μ
λλ§μ λ½μμ `Stream<T>`λ‘ λ§λ€κ³ μΆμλ.. |
| 111 | + |
| 112 | +```java |
| 113 | +//not good (μλ°8) |
| 114 | +Stream<Person> personStream = streamOfOptionals |
| 115 | + .filter(Optional::isPresent) |
| 116 | + .map(Optional::get); |
| 117 | + |
| 118 | +//good (μλ°9 μ΄μ) |
| 119 | +Stream<Person> personStream = streamOfOptionals |
| 120 | + .flatMap(Optional::stream); |
| 121 | +``` |
| 122 | + |
| 123 | +### μ£Όμμ¬ν |
| 124 | + |
| 125 | +- 컬λ μ
, μ€νΈλ¦Ό, λ°°μ΄, μ΅μ
λκ°μ 컨ν
μ΄λ νμ
μ μ΅μ
λλ‘ κ°μΈλ©΄ μλλ€. |
| 126 | + - `Optional<List<T>>` λ³΄λ¨ λΉ `List<T>`μ λ°ννλ κ² μ’λ€ |
| 127 | + - κ·Έλ¬λ©΄ ν΄λΌμ΄μΈνΈμμ μ΅μ
λ μ²λ¦¬ μ½λλ₯Ό λ£μ§ μμλ λλ€ |
| 128 | +- λ°μ±λ κΈ°λ³Ένμ
(`Integer`, `Long`, `Double`)μ λ΄μ μ΅μ
λμ λ°ννλ©΄ μλλ€. |
| 129 | + - λ°μ±λ κΈ°λ³Ένμ
μ λ΄λ μ΅μ
λμ κΈ°λ³Έ νμ
μμ²΄λ³΄λ€ λ¬΄κ²κΈ° λλ¬Έμ μλ° API μ€κ³μλ κΈ°λ³Ένμ
μ μ© μ΅μ
λμ μ΄λ―Έ λ§λ€μ΄λ¨λ€. |
| 130 | + - `OptionalInt`, `OptionalLong`, `OptionalDouble`μ μ¬μ©νμ |
| 131 | + - λ μ€μν κΈ°λ³Ένμ
μ©(`Boolean`, `Byte`, `Character`, `Short`, `Float`)μ μ μΈ |
| 132 | +- μ΅μ
λμ 컬λ μ
μ ν€, κ°, μμλ λ°°μ΄μ μμλ‘ μ¬μ©νλ κ² μ μ ν μν©μ κ±°μ μλ€ |
| 133 | + - μλ₯Ό λ€μ΄ μ΅μ
λμ 맡μ κ°μΌλ‘ μ¬μ©νλ€λ©΄ μΈλ°μμ΄ λ³΅μ‘μ±λ§ λμμ§λ€ |
| 134 | +- μ΅μ
λμ μΈμ€ν΄μ€ νλμ μ μ₯νλ 건 λλΆλΆ μμ’μ§λ§ νμκ° μλ νλμ κ²½μ°μ μ μ ν μν©λ μλ€ |
0 commit comments