【前言】 java8新特性html
java8 推出的Optional的目的就是爲了杜絕空指針異常,幫助開發者開發出更優雅的代碼,使用Optional不正確時,將會違背設計者的初衷。java
一、Optional.of(T) 函數
該方式的入參不能爲null,不然會有NPE,在肯定入參不爲空時使用該方式。post
二、Optional.ofNullable(T)url
該方式的入參能夠爲null,當入參不肯定爲非null時使用。spa
三、Optional.empty()設計
這種方式是返回一個空Optional,等效Optional.ofNullable(null)指針
一、避免使用Optional.isPresent()來檢查實例是否存在,由於這種方式和null != obj沒有區別,這樣用就沒什麼意義了。rest
二、避免使用Optional.get()方式來獲取實例對象,由於使用前須要使用Optional.isPresent()來檢查實例是否存在,不然會出現NPE問題。code
三、避免使用Optional做爲類或者實例的屬性,而應該在返回值中用來包裝返回實例對象。
四、避免使用Optional做爲方法的參數,緣由同3。
一、實例對象存在則返回,不然提供默認值或者經過方法來設置返回值,即便用orElse/orElseGet方式:
//存在則返回
User king = new User(1, "king"); Optional<User> userOpt = Optional.of(king); User user = userOpt.orElse(null); System.out.println(user.getName());
//不存在提供默認值
User user2 = null; Optional<User> userOpt2 = Optional.ofNullable(user2); User user3 = userOpt2.orElse(unknown); System.out.println(user3.getName());
//經過方法提供值
User user4 = userOpt2.orElseGet(() -> new User(0, "DEFAULT"));
System.out.println(user4.getName())
不建議這樣使用:
if(userOpt.isPresent()) { System.out.println(userOpt.get().getName()); } else { //。。。 }
二、使用ifPresent()來進行對象操做,存在則操做,不然不操做。
//實例存在則操做,不然不操做 userOpt.ifPresent(u -> System.out.println(u.getName())); userOpt2.ifPresent(u -> System.out.println(u.getName()));
三、使用map/flatMap來獲取關聯數據
//使用map方法獲取關聯數據 System.out.println(userOpt.map(u -> u.getName()).orElse("Unknown")); System.out.println(userOpt2.map(u -> u.getName()).orElse("Default")); //使用flatMap方法獲取關聯數據 List<String> interests = new ArrayList<String>(); interests.add("a");interests.add("b");interests.add("c"); user.setInterests(interests); List<String> interests2 = Optional.of(user) .flatMap(u -> Optional.ofNullable(u.getInterests())) .orElse(Collections.emptyList()); System.out.println(interests2.isEmpty());
以上對於Optional的使用只是我的常常使用的一些總結,若有不對之處望糾正。正確使用Optiona不只能夠避免NPE問題,還可使代碼看起來更加簡潔。