<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
為了讓我更快的熟悉程式碼,前段時間組長交代了一個小任務,大致就是讓我整理一下某個模組中涉及的 sql,也是方便我有目的的看程式碼,也是以後方便他們查問題(因為這個模組,涉及的判斷很多,所以之前如果 sql 出錯了,查問題比較繁瑣)。
昨天算是基本完成了,然後今天組長就讓給我看一個該模組的缺陷,由於剛對該模組進行過整理,所以還算清晰......看程式碼過程中,看到一些地方進行判空時都用到了 orElse() 方法,之前沒怎麼用過,熟悉一下......
Optional 類是 Java8 為了解決 NULL 值判斷等問題提出的。使用 Optional 類可以避免顯式的判斷 NULL 值(NULL 的防禦性檢查),避免某一處因為出現 NULL 而導致的 NPE(NullPointerException)。
/** * A container object which may or may not contain a non-null value. * If a value is present, {@code isPresent()} will return {@code true} and * {@code get()} will return the value. */ public final class Optional<T> { /** * Common instance for {@code empty()}. */ private static final Optional<?> EMPTY = new Optional<>(); //執行Optional的無參構造 //無參構造 private Optional() { this.value = null; } //有參構造 private Optional(T value) { this.value = Objects.requireNonNull(value); } /** * Returns an {@code Optional} describing the specified value, if non-null, * otherwise returns an empty {@code Optional}. * 如果value不是null, 返回它自己本身, 是空, 則執行empty(), 返回null * * @param <T> the class of the value * @param value the possibly-null value to describe * @return an {@code Optional} with a present value if the specified value * is non-null, otherwise an empty {@code Optional} */ public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); } /** * Returns an empty {@code Optional} instance. No value is present for this * Optional. * 當value是空時, 返回Optional<T>物件 * * @apiNote Though it may be tempting to do so, avoid testing if an object * is empty by comparing with {@code ==} against instances returned by * {@code Option.empty()}. There is no guarantee that it is a singleton. * Instead, use {@link #isPresent()}. * * @param <T> Type of the non-existent value * @return an empty {@code Optional} */ public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; //由第一行程式碼可知, EMPTY是一個無參Optional物件 return t; } /** * Returns an {@code Optional} with the specified present non-null value. * 返回不等於null的value值本身 * * @param <T> the class of the value * @param value the value to be present, which must be non-null * @return an {@code Optional} with the value present * @throws NullPointerException if value is null */ public static <T> Optional<T> of(T value) { return new Optional<>(value); //執行Optional的有參構造 } }
從原始碼中可以看出來,ofNullable() 方法做了 NULL 值判斷,所以我們可以直接呼叫該方法進行 NULL 值判斷,而不用自己手寫 NULL 值判斷。
/** * Return the value if present, otherwise return {@code other}. * 如果值存在(即不等於空), 返回值本身, 如果等於空, 就返回orElse()方法的引數other. * * @param other the value to be returned if there is no value present, may * be null * @return the value, if present, otherwise {@code other} */ public T orElse(T other) { return value != null ? value : other; }
從原始碼中可以看出,呼叫 orElse() 方法時,當值為 NULL 值,返回的是該方法的引數;當值不為 NULL 時,返回值本身。
Optional.ofNullable(scRespDTO.getMsgBody().getSuccess()).orElse(false);
上述案例中,如果 ofNullable() 方法執行結果不為 NULL,則返回 scRespDTO.getMsgBody().getSuccess() 的值;
如果 ofNullable() 方法的執行結果是 NULL,則返回 false,即,orElse() 方法的引數。
/** * Return the value if present, otherwise invoke {@code other} and return * the result of that invocation. * 值如果存在(即不為空), 返回值本身, 如果不存在, 則返回實現了Supplier介面的物件. * Supplier介面就只有一個get()方法. 無入參,出參要和Optional的物件同型別. * * @param other a {@code Supplier} whose result is returned if no value * is present * @return the value if present otherwise the result of {@code other.get()} * @throws NullPointerException if value is not present and {@code other} is * null */ public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); }
從原始碼中可以看出來,呼叫 orElseGet() 方法時,如果值為 NULL,返回的是實現了 Supplier 介面的物件的 get() 值;
如果值不為 NULL,則返回值本身。
System.out.println(Optional.ofNullable("努力成為一名更優秀的程式媛").orElseGet(()->"你不夠優秀")); System.out.println(Optional.ofNullable(null).orElseGet(()->"你沒有努力"));
orElseGet() 可以傳入一個supplier介面,裡面可以花樣實現邏輯。
上述案例中,第一句,ofNullable() 不為 NULL,就輸出"努力成為一名更優秀的程式媛",反之,則輸出"你不夠優秀";
第二句,ofNullable() 為 NULL, 輸出 "你沒有努力"。
注意
orElse() 與 orElseGet() 兩者之間是 有區別 的。雖然當值為 NULL 時,orElse() 與 orElseGet() 都是返回方法的引數,但區別就是:orElse() 方法返回的是引數本身,而 orElseGet() 方法並不是直接返回引數本身,而是返回 引數的 get() 值,且 該引數物件必須實現 Supplier 介面(該介面為函數式介面)。這就使得 orElseGet() 方法更加靈活。
簡單做了一下 Java 中 Optional 類以及其中的 orElse() 方法 與 orElseGet() 方法相關的內容,以前沒有了解過。文中顯然引入了許多原始碼,也是為了方便理解不是? :)
以上就是Java中Optional類及orElse()方法詳解的詳細內容,更多關於Java Optional類 orElse()方法的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45