Java 8μ μλ‘ μκΈ΄ μΈν°νμ΄μ€λ‘ λΌμ΄λΈλ¬λ¦¬ λ©μλκ° λ°νν κ²°κ³Όκ°μ΄ μμμ λͺ
λ°±νκ² ννν νμκ° μλ κ³³μμ μ νμ μΌλ‘ μ¬μ©ν μ μλ λ©μ»€λμ¦μ μ 곡νκΈ° μν΄ μλ‘ μ겨λ¬λ€.
Java api docμ API λ
ΈνΈλ₯Ό 보면 λ€μκ³Ό κ°μ΄ μ€λͺ
νκ³ μλ€. Optionalμ μ£Όλ‘ κ²°κ³Ό μμμ λνλΌ νμμ±μ΄ λͺ
ννκ³ nullμ μ¬μ©νλ©΄ μ€λ₯κ° λ°μν μ μλ λ©μλ λ°ν μ νμΌλ‘ μ¬μ©νλλ‘ κ³ μλμλ€. μ νμ΄ μ΅μ
μΈ λ³μ μ체λ nullμ΄ μλλ―λ‘ νμ μ΅μ
μΈμ€ν΄μ€λ₯Ό κ°λ¦¬μΌμΌ νλ€.
Optionalμ μ¬λ°λ₯΄κ² μ¬μ©νκΈ°
1. Optional λ³μμ null λμ Optional.empty() μ¬μ©
Optional<Car> optionalCar = null;
Optional<Car> optionalCar = Optional.empty();
2. Optional κ°μ κΊΌλ΄μ°κΈ° μ μ κ°μ΄ μλμ§ νμΈνκΈ°
Optional<Car> optionalCar = Optional.empty();
Car car = optionalCar.get(); //NoSuchElementException λ°μ
Optionalμ κ°μ΄ λΉμ΄μμ μλ μκΈ° λλ¬Έμ μ¬μ©νκΈ°μ μ μ‘΄μ¬νλ€λ κ²μ μ¦λͺ
ν΄μΌ νλλ° μΌλ°μ μΌλ‘λ isPresent()νμ get()μ μ¬μ©ν μ μμ§λ§ μ½λλ κΈΈμ΄μ§κ³ νλ²μ μ¬μ©ν μ μλ APIλ₯Ό μ 곡νκΈ° λλ¬Έμ μ΄λ₯Ό μ¬μ©ν΄λ³΄μ.
//isPresent - get
if(optionalCar.isPresent()){
return optionalCar.get();
}else {
return null;
}
//orElse
return optionalCar.orElse(null);
//orElseGet
return optionalCar.orElseGet(() -> null);
orElseGet()μ Supplierλ₯Ό μΈμλ‘ λ°μΌλ©°, κ°μ΄ μμλμ ν΄λΉ supplierκ° μνλλ€. νμ§λ§ orElse()λ Optionalλ‘ κ°μΈκ³ μλ κ°μ²΄νμ
μ μΈμλ‘ λ°μΌλ©° κ°μ΄ μλλΌλ λ΄λΆκ° μνλκ³ μ¬μ©λμ§ μλ κ²½μ° ν΄λΉ κ°μ²΄λ₯Ό μ§μ°κ² λμ΄ νμμλ μ€λ²ν€λκ° λ°μνλ€.
μλ₯Ό λ€μ΄ μμ κ°μ μ½λλ₯Ό μμ±νμλ optStrμ nullμ΄ μλλΌ new String("hi1")κ° μ€νλμ§ μμ κ² κ°μ§λ§ λ°μ΄νΈμ½λλ₯Ό 보면 μλ‘ λ¬Έμμ΄μ μμ±νλ€κ° POPνλ κ²μ λ³Ό μ μκ³ , orElseGet()μ μ°λ¦¬κ° lambdaμμ λ΄€λκ²μ²λΌ static λ©μλλ‘ μμ±νμ¬ νΈμΆλλ νμ΄λ°μ μ΄λ₯Ό μ€νν΄ κ°μ²΄λ₯Ό μμ±νλ κ²μ λ³Όμμμ΄ orElseλ νμμλ μ€λ²ν€λμ μ£Όμν΄μΌνλ€. νμ§λ§ λ°λμ μ΄λ―Έ μμ±λμ΄μλ κ°μ²΄λ₯Ό λ°ννλ κ²μ΄λΌλ©΄ orElse()λ₯Ό μ¬μ©νλ κ²μ΄ μ’μ μλ μλ€.
μμΈμ²λ¦¬λ₯Ό νλ κ²½μ°μλ isPresent()λ₯Ό ν΅ν μμΈμ²λ¦¬λ³΄λ€λ orElseThrow()λ₯Ό μ΄μ©νμ¬ μμΈμ²λ¦¬λ₯Ό νλ κ²μ΄ λ°λμ§νλ€. μΈμλ‘ Supplierλ₯Ό ν΅ν΄ νΉμ Exceptionμ λμ§ μ μλλ° μ무κ²λ μ£Όμ§ μμΌλ©΄ κΈ°λ³Έμ μΌλ‘ NoSuchElementExceptionμ λμ§λ€.
3. Optionalμ΄ μμλλ§ μ΄λ₯Ό μλΉνμ¬ λ¬΄μΈκ°λ₯Ό ν λλ ifPresent()λ₯Ό νμ©
4. 컬λ μ
μ Optionalλμ λΉμ΄μλ 컬λ μ
μ μ¬μ©νμ.
5. 컬λ μ
μ Optionalλ‘ κ°μΈμ§λ§μ.
컬λ μ
μμ²΄κ° λ°μ΄ν°λ₯Ό κ°μΌ ννμ κ°μ²΄μ΄κ³ μ΄λ μΆ©λΆν APIλ₯Ό μ 곡νκΈ° λλ¬Έμ νλ²λ Optionalλ‘ κ°μΈλ©΄ νμμλ μ€λ²ν€λκ° λ°μνλ€. JPAμ λ©μλλ₯Ό μμ±ν λλ JPAμ체μ μΌλ‘ λΉμ΄μλ 컬λ μ
μ λ°νν΄μ£Όλ―λ‘ Optionalλ‘ κ°μ νμκ° μλ€.
6. 컬λ μ
,Mapμ μμλ‘ Optionalμ μ¬μ©νμ§ λ§μ.
7. λ¨μΌ κ°μ μ»κΈ° μν λͺ©μ μΌλ‘ λ©μλ 체μ΄λμ νμ§λ§μ.
Optionalμ μ¬μ©νλ κ²μ κ²°κ΅ λνλμ λνΌκ°μ²΄λ₯Ό μ¬μ©νλ κ²μ΄λ―λ‘ λ¨μν λ‘μ§μ΄λΌλ©΄ κ·Έλ₯ μ½λ©νμ. ꡬκ΄μ΄ λͺ
κ΄μ΄λΌνλ€.
8. Optionalμ νλλ‘ μ¬μ©νμ§λ§μ.
Optionalμ μ μ΄μ νλλ‘ μ¬μ©ν λͺ©μ μΌλ‘ λ§λ€μ΄μ§μ§ μμ Serializableλ ꡬννμ§ μμκΈ° λλ¬Έμ μ¬μ©μ μ§μν΄μΌ νλ€.
9. Optionalμ λ©μλ,μμ±μ μΈμλ‘ μ¬μ©νμ§λ§μ.
μ΄λ¬ν λ°©λ²μ λΆνμνκ² μ½λλ₯Ό 볡μ‘νκ² ν λΏμλλΌ μ΄λ₯Ό νΈμΆνλ μͺ½μμλ Optional μμ±μ κ°μ νκ² νλ κ²μ΄λ€. λν, Optionalμ νλμ κ°μ²΄λ‘ μ΄λ₯Ό νΈμΆνλ κ²μ΄ κ²°μ½ λΉμ©μ΄ μ λ ΄νμ§ μλ€.
10. nullμ΄ νμ€νλ©΄ ofNullable()μ΄ μλ of()λ₯Ό μ¬μ©νμ.
ofNullableμ λ΄λΆμ μΌλ‘ 보면 μΌνμ°μ°μλ₯Ό ν΅ν΄ λΉμ΄μμ§ μλ κ²½μ° ofλ₯Ό νΈμΆνλ κ²μ λ³Ό μμλ€. κ·Έλ κΈ° λλ¬Έμ μ΄λ¬ν μ°μ°μ μ‘°κΈμ΄λΌλ μ€μΌ μ μκΈ° λλ¬Έμ ofλ₯Ό μ¬μ©νμ.
11. Optionalμ νμ
μ΄ Primitiveνμ
μ΄λ©΄ OptionalInt,OptionalLong, OptionalDoubleμ μ¬μ©νμ
λ΄λΆμ μΌλ‘ Integer.valueOf()λ₯Ό ν΅ν΄ νλ² boxingμ΄ μΌμ΄λλ κ²μ λ³Ό μ μκ³ λ μ΄λ₯Ό μ¬μ©ν λ unboxingμ΄ μΌμ΄λκΈ° λλ¬Έμ OptionalIntλ₯Ό μ¬μ©νλ κ²μ΄ μ’λ€.
12. Optionalμ 리ν΄νλ λ©μλμμ nullμ 리ν΄νμ§ λ§μ.
λΉμ°νκ±°μ§λ§ Optionalλ κ°μ²΄μ΄κΈ° λλ¬Έμ nullμ 리ν΄μ΄ κ°λ₯νλ° μ΄λ κ² λ¦¬ν΄νκ² λλ©΄ Optionalμ μ¬μ©νλ κ²μ΄ μλ―Έκ° μκΈ° λλ¬Έμ nullμ 리ν΄νμ§ λ§μ.
https://dzone.com/articles/using-optional-correctly-is-not-optional