Optional
Java 8 μμ μ²μ λ±μ₯ν κ°λ
μΌλ‘ null
μ μ κ·Ό λ°©μμ λν ν΄κ²°μ±
μΌλ‘ λ±μ₯ νμλ€.
NPE (Null Pointer Exception)
μ ν΅μ μΈ NPE λ°©μ΄ ν¨ν΄μ λ€μ λκ°μ§λ‘ λλλ€.
μ€μ²© null
체ν¬νκΈ°
public String getCityOfMemberFromOrder(Order order) {
if (order != null) {
Member member = order.getMember();
if (member != null) {
Address address = member.getAddress();
if (address != null) {
String city = address.getCity();
if (city != null) { return city; }
}
}
}
return "Seoul"; // default
}
μ¬λ°©μμ return
νκΈ°
public String getCityOfMemberFromOrder(Order order) {
if (order == null) {
return "Seoul";
}
Member member = order.getMember();
if (member == null) {
return "Seoul";
}
Address address = member.getAddress();
if (address == null) {
return "Seoul";
}
String city = address.getCity();
if (city == null) {
return "Seoul";
}
return city;
}
Optional
μ΄λ?
Optional
μ μ‘΄μ¬ν μλ μμ§λ§ μ ν μλ μλ κ°μ²΄, μ¦ null
μ΄ λ μλ μλ κ°μ²΄ λ₯Ό κ°μΈκ³ μλ μΌμ’
μ Wrapper Class
μ΄λ€.
Optional
μ¬μ©λ²
Generic
μ μ 곡νκΈ° λλ¬Έμ λ³μ μ μΈν λ λͺ
μν νμ
μ λ°λΌμ κ°μμ μλ κ°μ²΄μ νμ
μ΄ κ²°μ λλ€.
μ μΈ
// Order νμ
μ κ°μ²΄λ₯Ό κ°μ μ μλ Optional νμ
λ³μ
Optional<Order> maybeOrder;
// Member νμ
μ κ°μ²΄λ₯Ό κ°μ μ μλ Optional νμ
λ³μ
Optional<Member> optMember;
// Address νμ
μ κ°μ²΄λ₯Ό κ°μ μ μλ Optional νμ
λ³μ
Optional<Address> address;
μμ±
Optional
ν΄λμ€λ κ°νΈνκ² κ°μ²΄λ₯Ό μμ±ν μ μλ 3κ°μ§μ μ μ ν©ν 리 λ©μλλ₯Ό μ 곡ν©λλ€.
Optional.empty()
null
μ λ΄κ³ μλ λΉμ΄μλ Optional κ°μ²΄λ₯Ό μ»μ΄μ΅λλ€.
μ΄ κ°μ²΄λ Optional
λ΄λΆμ μΌλ‘ 미리 μμ±ν΄λμ μ±κΈν΄ μΈμ€ν΄μ€μ
λλ€.
Optional<Member> maybeMember = Optional.empty();
Optional.of(value)
null
μ΄ μλ κ°μ²΄λ₯Ό λ΄κ³ μλ Optional
κ°μ²΄λ₯Ό μμ±ν©λλ€.
null
μ΄ λμ΄μ¬λ NPE λ₯Ό λμ§κΈ° λλ¬Έμ μ£Όμν΄μ μ¬μ©ν΄μΌ νλ€.
Optional<Member> maybeMember = Optional.of(aMember);
Optional.ofNullable(value)
null
μΈμ§ μλμ§ νμ ν μ μλ κ°μ²΄λ₯Ό λ΄κ³ μλ Optional κ°μ²΄λ₯Ό μμ±ν©λλ€.
Optional.empty()
μ Optional.ofNullable(value)
λ₯Ό ν©μ³λμ λ©μλλΌκ³ μκ°νλ©΄ μ½λ€.
ν΄λΉ κ°μ²΄κ° null
μΈμ§ μλμ§ νμ μ΄ μλ μν©μμ ν΄λΉ λ©μλλ₯Ό μ¬μ©ν΄μΌ νλ€.
Optional<Member> maybeMember = Optional.ofNullable(aMember);
Optional<Member> maybeMember = Optional.ofNullable(null);
μ°Έκ³ μλ£
https://futurecreator.github.io/2018/08/26/java-8-streams/
http://www.daleseo.com/java8-optional-before/
κ°μ²΄ μ κ·Ό
Optional
μ΄ λ΄κ³ μλ κ°μ²΄λ₯Ό λ°ννλ©° Optional
μ΄ λΉμ΄μλ κ²½μ° (null μΈ κ²½μ°) μλ λ€λ₯΄κ² μλνλ€.
get()
λΉμ΄μλ Optional κ°μ²΄μ λν΄μ, NoSuchElementException
μ λμ§λ€.
orElse(T other)
λΉμ΄μλ Optional
κ°μ²΄μ λν΄μ, λμ΄μ¨ μΈμλ₯Ό λ°ννλ€.
orElseGet(Supplier<? extends T> other)
λΉμ΄μλ Optional
κ°μ²΄μ λν΄μ, λμ΄μ¨ ν¨μν μΈμλ₯Ό ν΅ν΄ μμ±λ κ°μ²΄λ₯Ό λ°ννλ€.
orElse(T other)
μ κ²μΌλ₯Έ λ²μ μ΄λ€.
λΉμ΄ μλ κ²½μ°μλ§ ν¨μκ° νΈμΆλκΈ° λλ¬Έμ orElse(T other)
μ λλΉ μ±λ₯μμ μ΄μ μ κΈ°λν μ μλ€.
orElseThrow(Supplier<? extends X> exceptionSupplier)
λΉμ΄μλ Optional κ°μ²΄μ λν΄μ, λμ΄μ¨ ν¨μν μΈμλ₯Ό ν΅ν΄ μμ±λ μμΈλ₯Ό λμ§λ€.
Stream μ²λΌ μ¬μ©
map()
public String getCityOfMemberFromOrder(Order order) {
return order.getMember().getAddress().getCity();
}
μ μ½λλ₯Ό μλμ κ°μ΄ λ³κ²½
public String getCityOfMemberFromOrder(Order order) {
return Optional.ofNullable(order)
.map(Order::getMember)
.map(Member::getAddress)
.map(Address::getCity)
.orElse("Seoul");
}
filter()
public Member getMemberIfOrderWithin(Order order, int min) {
if (order != null && order.getDate().getTime() > System.currentTimeMillis() - min * 1000) {
return order.getMember();
}
}
μμ κ°μ΄ null
μ²λ¦¬νλ λΆλΆ νΉμ boolean
μΌλ‘ 체ν¬νλ λΆλΆμ μλμ κ°μ΄ λ³κ²½
public Optional<Member> getMemberIfOrderWithin(Order order, int min) {
return Optional.ofNullable(order)
.filter(o -> o.getDate().getTime() > System.currentTimeMillis() - min * 1000)
.map(Order::getMember);
}
isParent()
κ°μ΄ λΉμ΄μλμ§ μ²΄ν¬
Optional<String> type = Optional.of(null);
if (type.isParent()) {
System.out.println("type is null");
}
ifPresent
νΉμ κ²°κ³Όλ₯Ό λ°ννλ λμ μ Optional
κ°μ²΄κ° κ°μΈκ³ μλ κ°μ΄ μ‘΄μ¬ν κ²½μ° μ€νλ λ‘μ§μ ν¨μν μΈμλ‘ λκΈ°λκ²μ΄ κ°λ₯νλ€.
λ§μΉ λΉλκΈ° λ©μλμ μ½λ°± ν¨μμ²λΌ λμλλ€.
Optional<String> maybeCity = getAsOptional(cities, 3); // Optional
maybeCity.ifPresent(city -> {
System.out.println("length : " + city.length());
});