java之Optional的使用和源碼分析
- 2019 年 10 月 30 日
- 筆記
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)); }