java之Optional的使用和源碼分析

  • 2019 年 10 月 30 日
  • 筆記

對於一個從事javaWeb開發的後端人員,對入參校驗或多或少都有所了解或者熟悉。

ok,今天自己分享下使用jdk提供的Optional工具類如何使用進行對null的判空操作。還是一貫的風格,先看下示常式序。

public static void main(String[] args) {        User user = new User().setName("後端Coder").setAge(1);        Optional<User> userOptional = Optional.ofNullable(user);        userOptional.ifPresent(System.out::println);        }        @Data      @Accessors(chain = true)      static class User {          private String name;          private int age;            User() {          }      }

看下面的方法之前,建議你先對這篇文章java的靜態工廠方法進行了解下。

這裡自己主要使用的是Optional.ofNullable()方法進行校驗的,我們看下這個方法的程式碼好了,繼續。

public static <T> Optional<T> ofNullable(T value) {          return value == null ? empty() : of(value);     }

這裡主要對傳入的值使用了三元運算符進行了null值的判斷,若是null,直接調用empty()方法,我們還是先看下empty()所涉及的程式碼先。若為null直接返回一個空的Optional對象。

    private static final Optional<?> EMPTY = new Optional<>();        public static<T> Optional<T> empty() {          @SuppressWarnings("unchecked")          Optional<T> t = (Optional<T>) EMPTY;          return t;      }      

ok,我們看下不為空的時候,調用的是of()方法,我們還是直接先看程式碼好了,程式碼如下:

public static <T> Optional<T> of(T value) {          return new Optional<>(value);    }

調用of()方法,返回一個使用Optional對象包裹的值,通過返回的值我們直接調用get()方法就拿到了我們真正需要的對象數據,比如上面的實例程式碼中,我們可以通過下方程式碼的方式進行對象資訊數據的輸出

 User user = userOptional.get();   System.out.println("user = " + user);

到這裡,基本上我們就上面用到的方法走了整個的程式碼方式的實現,實際上我們在對數據進行入參校驗時,也是自己封裝好一個工具類進行使用,既然別人已經封裝好了,程式碼比我們寫的整潔有力,還是使用別人的好了。

下面我們繼續說下另外一個對null值進行判斷的工具類吧,還是先看程式碼好了,這樣比較簡潔,有說服力。

 @Test      public void test(){          User user=new User();          if (Objects.nonNull(user)){              System.out.println("創建的對象不為null");          }else{              System.out.println("創建的對象為null");          }      }      @Data      @Accessors(chain = true)      static class User {          private String name;          private  Integer age;              public User() {          }            public User(String name, Integer age) {              this.name = name;              this.age = age;          }      }

這裡面需要介紹和想要介紹的就是Objects.isNull()和Objects.notNull()方法時程式碼了,ok,我們繼續分析Objects.notNull()方法的程式碼好了,不扯別的,壞笑。

public static boolean nonNull(Object obj) {          return obj != null;      }

就一句話判斷obj!=null,哈哈,好像和我們寫的沒什麼區別,接下來我們看下另外一個方法,Objects.isNull()方法的程式碼

 public static boolean isNull(Object obj) {          return obj == null;     }

也是一句話,希望可以幫助到你,喜歡的轉發,分享,關注一下哈。

 @Test      public void test() {          User user = null;          Objects.requireNonNull(user,"創建的對象實例為null");      }      在這裡手動模擬一下創建的對象實例為null的情況,主要是想讓你看下      Objects.requireNonNull()方法的使用

我們繼續看下這個方法的程式碼好了。

 public static <T> T requireNonNull(T obj, String message) {          if (obj == null)              throw new NullPointerException(message);          return obj;      }

這裡面對傳入的值進行null值的比較,若為null,直接拋出NPE異常資訊,現在對入參判斷的方法,我們大致上看完了,接下來我們看下其它的方法好了。

Tips:左右滑動可以看到完整程式碼。

 @Test   public void test(){          int compare = Objects.compare(1, 2, new Comparator<Integer>() {              @Override              public int compare(Integer o1, Integer o2) {                  return o1.compareTo(o2);              }      });      System.out.println("compare = " + compare);//compare = -1      }

上面我們使用到了Objects.compare()方法,對傳入的數據使用內部類方式進行比較。

接下來我們看看其它的方法吧,文章到這邊也差不多就要說完了。

 boolean flag = Objects.equals(1, 1);   System.out.println("flag = " + flag);//flag=true

好的,再看下這兩個方法的程式碼。

public static <T> int compare(T a, T b, Comparator<? super T> c) {          return (a == b) ? 0 :  c.compare(a, b);      }

使用三元運算符進行判斷,不滿足條件的時候使用compare()方法進行再判斷,其實內部調用的是傳統的寫法。

下面看下Objects.equals()方法的程式碼,對兩個對象的引用地址進行判斷,然後是值得判斷。是不是和這篇文章的內容很像java面試篇之equals和==的區別究竟在哪?,你懂了吧,喜歡的可以看下和分享下。

 public static boolean equals(Object a, Object b) {          return (a == b) || (a != null && a.equals(b));      }