基本方法:
ofNullable()
為可能 null 的值創建一個 Optional 實例, 然后可以對該實例遍歷/過濾, 判斷是否存在,或者為空時執行..ifPresent(...)
如果值存在則執行里面的方法
應用場景:
1> 默認值
傳統方式
public static String getName(User u) { if (u == null) return "Unknown"; return u.name; }
杜絕使用這種方式(不簡潔)
public static String getName(User u) { Optional<User> user = Optional.ofNullable(u); if (!user.isPresent()) return "Unknown"; return user.get().name; }
正確方式(鏈式調用):
public static String getName(User u) { return Optional.ofNullable(u) .map(user->user.name) .orElse("Unknown"); //.orElseGet(() -> "john"); }
2>多重非空條件判斷
傳統方式
public static String getChampionName(Competition comp) throws IllegalArgumentException { if (comp != null) { CompResult result = comp.getResult(); if (result != null) { User champion = result.getChampion(); if (champion != null) { return champion.getName(); } } } throw new IllegalArgumentException("The value of param comp isn't available."); }
鏈式調用(map 遍歷屬性)
public static String getChampionName(Competition comp) throws IllegalArgumentException { return Optional.ofNullable(comp) .map(c->c.getResult()) .map(r->r.getChampion()) .map(u->u.getName()) .orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available.")); }
3> 不為空才操作(單邊判斷)
string.ifPresent(System.out::println);
4> 指定條件過濾
public boolean priceIsInRange2(Modem modem2) { return Optional.ofNullable(modem2) .map(Modem::getPrice) .filter(p -> p >= 10) .isPresent(); }
5. filter 與 findFirst 結合
Optional<String> found = Stream.of(getEmpty(), getHello(), getBye()) .filter(Optional::isPresent) .map(Optional::get) .findFirst();
233