Java8對null有更優雅的處理方式Optional類。html
Optional<Object> empty = Optional.empty();
EMPTY持有某個類型的空值結構,調用empty()返回的便是該實例java
Optional.ofapp
仍是返回空指針異常,不常用函數
Optional.ofNullable指針
爲空,返回empty對象code
user = Optional.ofNullable(user).orElse(createUser()); user = Optional.ofNullable(user).orElseGet(() -> createUser());
當other不爲空時,依然會執行括號中的代碼htm
rElseGet函數並不會執行createUser()方法對象
value值爲null時,直接拋一個異常出去blog
這兩個函數,在函數體上沒什麼區別。惟一區別的就是入參,map函數所接受的入參類型爲Function<? super T, ? extends U>,而flapMap的入參類型爲Function<? super T, Optional<U>>。ci
在具體用法上,對於map而言: 若是User結構是下面這樣的
public class User { private String name; public String getName() { return name; } }
這時候取name的寫法以下所示
String city = Optional.ofNullable(user).map(u-> u.getName()).get();
對於flatMap而言: 若是User結構是下面這樣的
public class User { private String name; public Optional<String> getName() { return Optional.ofNullable(name); } }
這時候取name的寫法以下所示
String city = Optional.ofNullable(user).flatMap(u-> u.getName()).get();
Optional.ofNullable(user).ifPresent(u->{ // TODO: do something });
Optional<User> user1 = Optional.ofNullable(user).filter(u -> u.getName().length()<6);
filter 方法接受一個 Predicate 來對 Optional 中包含的值進行過濾,若是包含的值知足條件,那麼仍是返回這個 Optional;不然返回 Optional.empty。