日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java不要再使用!=null判空了!

瀏覽:10日期:2022-08-21 08:35:45
前言

對于Java程序員來說,null是令人頭痛的東西。時常會受到空指針異常(NPE)的騷擾。連Java的發明者都承認這是他的一項巨大失誤。

那么,有什么辦法可以避免在代碼中寫大量的判空語句呢?

有人說可以使用 JDK8提供的 Optional 來避免判空,但是用起來還是有些麻煩。

作者在日常工作中,封裝了一個工具,可以可以鏈式調用對象成員而無需判空,相比原有的if null邏輯 和 JDK8提供的 Optional 更加優雅易用,在工程實踐中大大提高了編碼效率,也讓代碼更加的精準和優雅。

不優雅的判空調用

我想從事Java開發的小伙伴肯定有遇到過下面這種讓人難受的判空邏輯:現在有一個User類,School 是它的成員變量

/*** @author Axin* @since 2020-09-20* @summary 一個User類定義 * (Ps:Data 是lombok組件提供的注解,簡化了get set等等的約定代碼)*/@Datapublic class User { private String name; private String gender; private School school; @Data public static class School { private String scName; private String adress; }}

現在想要獲得School的成員變量 adress , 一般的處理方式:

public static void main(String[] args) { User axin = new User(); User.School school = new User.School(); axin.setName('hello'); if (Objects.nonNull(axin) && Objects.nonNull(axin.getSchool())) { User.School userSc = axin.getSchool(); System.out.println(userSc.getAdress()); }}

獲取adress時要對School進行判空,雖然有些麻煩,到也能用,通過 JDK8 提供的 Optional 工具也是可以,但還是有些麻煩。而下文的 OptionalBean 提供一種可以鏈式不斷地調用成員變量而無需判空的方法,直接鏈式調用到你想要獲取的目標變量,而無需擔心空指針的問題。

鏈式調用成員變量

如果用了本文設計的工具 OptionalBean ,那么上述的調用可以簡化成這樣:

public static void main(String[] args) { User axin = new User(); User.School school = new User.School(); axin.setName('hello'); // 1. 基本調用 String value1 = OptionalBean.ofNullable(axin) .getBean(User::getSchool) .getBean(User.School::getAdress).get(); System.out.println(value1);}

執行結果:

Java不要再使用!=null判空了!

其中User的school變量為空,可以看到代碼并沒有空指針,而是返回了null。這個工具怎么實現的呢?

OptionalBean 工具

/*** @author Axin* @since 2020-09-10* @summary 鏈式調用 bean 中 value 的方法*/public final class OptionalBean<T> { private static final OptionalBean<?> EMPTY = new OptionalBean<>(); private final T value; private OptionalBean() { this.value = null; } /** * 空值會拋出空指針 * @param value */ private OptionalBean(T value) { this.value = Objects.requireNonNull(value); } /** * 包裝一個不能為空的 bean * @param value * @param <T> * @return */ public static <T> OptionalBean<T> of(T value) { return new OptionalBean<>(value); } /** * 包裝一個可能為空的 bean * @param value * @param <T> * @return */ public static <T> OptionalBean<T> ofNullable(T value) { return value == null ? empty() : of(value); } /** * 取出具體的值 * @param fn * @param <R> * @return */ public T get() { return Objects.isNull(value) ? null : value; } /** * 取出一個可能為空的對象 * @param fn * @param <R> * @return */ public <R> OptionalBean<R> getBean(Function<? super T, ? extends R> fn) { return Objects.isNull(value) ? OptionalBean.empty() : OptionalBean.ofNullable(fn.apply(value)); } /** * 如果目標值為空 獲取一個默認值 * @param other * @return */ public T orElse(T other) { return value != null ? value : other; } /** * 如果目標值為空 通過lambda表達式獲取一個值 * @param other * @return */ public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); } /** * 如果目標值為空 拋出一個異常 * @param exceptionSupplier * @param <X> * @return * @throws X */ public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } } public boolean isPresent() { return value != null; } public void ifPresent(Consumer<? super T> consumer) { if (value != null) consumer.accept(value); } @Override public int hashCode() { return Objects.hashCode(value); } /** * 空值常量 * @param <T> * @return */ public static<T> OptionalBean<T> empty() { @SuppressWarnings('unchecked') OptionalBean<T> none = (OptionalBean<T>) EMPTY; return none; }}

工具設計主要參考了 Optional 的實現,再加上對鏈式調用的擴展就是上述的OptionalBean。getBean 其實是當變量為空時返回了一個 包裝空值的 OptionalBean 對象,同時泛型的使用讓工具更加易用。

使用手冊

可以看到代碼中也提供了和 Optional 一樣的擴展方法,如 ifPresent()、orElse()等等:

public static void main(String[] args) { User axin = new User(); User.School school = new User.School(); axin.setName('hello'); // 1. 基本調用 String value1 = OptionalBean.ofNullable(axin) .getBean(User::getSchool) .getBean(User.School::getAdress).get(); System.out.println(value1); // 2. 擴展的 isPresent方法 用法與 Optional 一樣 boolean present = OptionalBean.ofNullable(axin) .getBean(User::getSchool) .getBean(User.School::getAdress).isPresent(); System.out.println(present); // 3. 擴展的 ifPresent 方法 OptionalBean.ofNullable(axin) .getBean(User::getSchool) .getBean(User.School::getAdress) .ifPresent(adress -> System.out.println(String.format('地址存在:%s', adress))); // 4. 擴展的 orElse String value2 = OptionalBean.ofNullable(axin) .getBean(User::getSchool) .getBean(User.School::getAdress).orElse('家里蹲'); System.out.println(value2); // 5. 擴展的 orElseThrow try { String value3 = OptionalBean.ofNullable(axin) .getBean(User::getSchool) .getBean(User.School::getAdress).orElseThrow(() -> new RuntimeException('空指針了')); } catch (Exception e) { System.out.println(e.getMessage()); }}

run一下:

Java不要再使用!=null判空了!

總結

設計了一種可以鏈式調用對象成員而無需判空的工具讓代碼更加的精準和優雅,如果本文設計的工具滿足了剛好解決你的困擾,那就在項目中使用吧!

到此這篇關于Java不要再使用!=null判空的文章就介紹到這了,更多相關Java不使用!=null判空內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久久伊人| 国产精品伊人| 中文字幕亚洲影视| 夜夜嗨网站十八久久 | 日韩中文在线播放| 天堂av在线| 国产精品一区二区av交换| 中文字幕av亚洲精品一部二部| 久热re这里精品视频在线6| 中文一区一区三区免费在线观 | 日韩国产欧美一区二区三区| 国产亚洲观看| 福利视频一区| 国产亚洲精品久久久久婷婷瑜伽| 久久精品一区二区不卡| 日韩影院在线观看| 国产欧美日韩精品高清二区综合区| 蜜桃久久av| 亚洲欧美一级| 日本黄色精品| 久久精品高清| 中文不卡在线| 亚洲日产国产精品| 青青国产91久久久久久| 久久精品青草| 手机在线电影一区| 日韩精品诱惑一区?区三区| 日本а中文在线天堂| 九九精品调教| 亚洲在线观看| 青青草国产精品亚洲专区无| 国产精品网址| 樱桃视频成人在线观看| 亚洲高清av| 中文字幕日韩亚洲| 欧美成人aaa| 国产精品毛片在线| 蜜桃av一区二区在线观看| 无码日韩精品一区二区免费| 国产精品22p| 欧美国产美女| 亚久久调教视频| 国产精品一区二区三区av麻| 成人台湾亚洲精品一区二区| 999国产精品视频| 91精品二区| 成人一二三区| 午夜av成人| 亚洲色图综合| 久久亚洲人体| 国产高清久久| 国产日韩欧美中文在线| 日韩一区二区在线免费| 亚洲日本免费电影| 四虎成人av| 综合激情婷婷| 鲁鲁在线中文| 亚洲午夜久久| 91欧美在线| 首页国产欧美久久| 久久久天天操| 成人一二三区| 日韩不卡一区二区三区 | 亚洲精品国产嫩草在线观看| 91在线成人| 红桃视频国产一区| 红桃视频亚洲| 精品五月天堂| 亚洲欧美久久精品| 欧美.日韩.国产.一区.二区 | 日韩午夜视频在线| 欧美综合另类| 激情黄产视频在线免费观看| 国产欧美综合一区二区三区| 亚洲图片久久| 国产精品美女久久久| 亚洲国产专区| 99精品网站| 婷婷激情一区| 不卡福利视频| 日韩国产一区二区三区| 福利视频一区| 成人国产精品一区二区网站| 国产精品porn| 国产精品一国产精品k频道56| 日韩久久一区| 免播放器亚洲一区| 麻豆91精品| 在线视频日韩| 成人影视亚洲图片在线| 久久精品理论片| 国产精品99精品一区二区三区∴ | 久久精品 人人爱| 亚洲一区二区三区无吗| 视频精品一区二区| 久久av一区| 久久国产88| 久久福利毛片| 中文字幕一区二区精品区| 亚洲免费高清| 亚洲少妇一区| 免费日韩一区二区| 亚洲区国产区| 欧美亚洲综合视频| 国产精品一区二区三区四区在线观看 | 丝袜脚交一区二区| 美女国产一区| 老司机精品久久| 男女男精品网站| 亚洲精选久久| 91九色综合| 国产精品扒开腿做爽爽爽软件| 日韩精品视频一区二区三区| 五月天久久777| 亚洲综合丁香| 亚洲精品在线a| 欧美日韩午夜| 国产一区二区三区久久| 亚洲午夜一级| 亚洲精品字幕| 国产乱码精品一区二区亚洲| 国产高清亚洲| 日韩黄色大片网站| 在线日韩中文| 免费精品视频最新在线| 日韩av资源网| 久久字幕精品一区| 岛国av在线网站| 久久久久久久久99精品大| 午夜免费一区| 亚洲精品观看| 美女国产一区二区三区| av资源亚洲| 亚洲欧美久久久| 日韩1区2区日韩1区2区| 久久精品国产99国产| 91精品韩国| 免费黄网站欧美| 麻豆精品视频在线观看| 快播电影网址老女人久久| 91成人精品视频| 欧美日本久久| 国产99在线| 999在线观看精品免费不卡网站| 亚洲欧美网站在线观看| 老鸭窝一区二区久久精品| 91精品xxx在线观看| 国产午夜久久| 久久不见久久见中文字幕免费 | 成人av二区| 日本va欧美va精品| 91视频久久| 免费在线观看日韩欧美| 国产免费久久| 亚洲黄色免费av| 免费精品视频在线| 国产传媒av在线| 亚洲毛片网站| 日韩在线不卡| 日韩精品亚洲专区| 久久九九国产| 国产欧美久久一区二区三区| 久久人人88| 国产亚洲久久| 亚洲午夜久久久久久尤物| 欧美日韩亚洲一区三区| 久久免费大视频| 国产精品v日韩精品v欧美精品网站 | 日韩av一区二| 久久久国产亚洲精品| 四虎精品永久免费| 电影亚洲精品噜噜在线观看| 日韩国产一区二| 国产在线欧美| 国产精品久久久久久模特| 九色精品91| 国产精品红桃| 国产亚洲精品v| 日本久久精品| 亚洲欧美日韩视频二区| 激情久久一区二区| 亚洲欧美专区| 亚洲欧美一区在线| 久久精品日韩欧美| 四虎精品一区二区免费| 欧美+日本+国产+在线a∨观看| 美女精品视频在线| 日韩有吗在线观看| 天堂网在线观看国产精品| 精品国产亚洲一区二区三区在线| 综合色一区二区| 婷婷六月综合| 蜜桃av.网站在线观看| 免费日韩一区二区三区| 亚洲欧美久久久| 91精品亚洲| 国产videos久久| 国产视频一区二| 亚洲一区有码| 欧美精品九九|