【前言】 java8新特性
java8 函數接口
java8 lambda表達式
Java 8 時間日期使用
java8 推出的Optional的目的就是為了杜絕空指針異常,幫助開發者開發出更優雅的代碼,使用Optional不正確時,將會違背設計者的初衷。
一、Optional的構造方式:
1、Optional.of(T)
該方式的入參不能為null,否則會有NPE,在確定入參不為空時使用該方式。
2、Optional.ofNullable(T)
該方式的入參可以為null,當入參不確定為非null時使用。
3、Optional.empty()
這種方式是返回一個空Optional,等效Optional.ofNullable(null)
二、 如何正確使用Optional
盡量避免使用的地方:
1、避免使用Optional.isPresent()來檢查實例是否存在,因為這種方式和null != obj沒有區別,這樣用就沒什么意義了。
2、避免使用Optional.get()方式來獲取實例對象,因為使用前需要使用Optional.isPresent()來檢查實例是否存在,否則會出現NPE問題。
3、避免使用Optional作為類或者實例的屬性,而應該在返回值中用來包裝返回實例對象。
4、避免使用Optional作為方法的參數,原因同3。
正確使用方式:
1、實例對象存在則返回,否則提供默認值或者通過方法來設置返回值,即使用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 { //。。。 }
2、使用ifPresent()來進行對象操作,存在則操作,否則不操作。
//實例存在則操作,否則不操作 userOpt.ifPresent(u -> System.out.println(u.getName())); userOpt2.ifPresent(u -> System.out.println(u.getName()));
3、使用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問題,還可以使代碼看起來更加簡潔。