java8 Optional使用總結 java8 函數接口 java8 lambda表達式 Java 8 時間日期使用

【前言】 java8新特性html

java8 函數接口

java8 lambda表達式

Java 8 時間日期使用

 

java8 推出的Optional的目的就是爲了杜絕空指針異常,幫助開發者開發出更優雅的代碼,使用Optional不正確時,將會違背設計者的初衷。java

1、Optional的構造方式:

一、Optional.of(T)  函數

該方式的入參不能爲null,不然會有NPE,在肯定入參不爲空時使用該方式。post

二、Optional.ofNullable(T)url

該方式的入參能夠爲null,當入參不肯定爲非null時使用。spa

三、Optional.empty()設計

這種方式是返回一個空Optional,等效Optional.ofNullable(null)指針

2、 如何正確使用Optional

儘可能避免使用的地方:

一、避免使用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());

3、總結

以上對於Optional的使用只是我的常常使用的一些總結,若有不對之處望糾正。正確使用Optiona不只能夠避免NPE問題,還可使代碼看起來更加簡潔。

相關文章
相關標籤/搜索