Java中的Optional使用詳細(xì)說明
簡(jiǎn)介
java.util.Optional java1.8 官方描述:
(這是一個(gè)可以為null的容器對(duì)象。如果值存在則isPresent()方法會(huì)返回true,調(diào)用get()方法會(huì)返回該對(duì)象。)
個(gè)人理解: Optional就是相當(dāng)于把對(duì)象包了一層,將判斷空的部分代碼給單獨(dú)抽出來了,主要就是為了避免null引起的部分問題.
Optional的使用
首先看看Optional的方法:
三個(gè)靜態(tài)方法
- Optional.empty()
返回一個(gè)空的Optional,用的不多;主要就是為了使Optional只存在有值和無值的情況,不存在包含null的情況,在后面的ofNullable方法中使用;
- Optional.of(T value)
public static <T> Optional<T> of(T value) { return new Optional<>(value); } private Optional(T value) { this.value = Objects.requireNonNull(value); } public static <T> T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; }
傳入一個(gè)非null的value值,返回一個(gè)包含value的Option;如果為null會(huì)拋出空指針異常;
- Optional.ofNullable(T value)(用的最多)
public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); }
傳入一個(gè)非null的value值,返回一個(gè)包含value的Option;
傳入一個(gè)value值,返回一個(gè)包含value的Option;可以為null,如果為null則返回一個(gè)空的Optional,就是Optional.empty(),可以看看源碼
方法介紹
Optional一般鏈?zhǔn)秸{(diào)用,方法也比較簡(jiǎn)單
- get()
- 如果該值存在,將該值直接返回,否則拋出一個(gè) NoSuchElementException 異常。
- isPresent()
- 返回該值是否存在的布爾值,存在true不存在false;
- isPresent(Consumer<? super T> consumer)
- 沒有返回值,傳入的是一個(gè)函數(shù),如果存在執(zhí)行函數(shù),不存在則不執(zhí)行
- filter(Predicate<? super T> predicate)
- filter 方法接受一個(gè) Predicate 來對(duì) Optional 中包含的值進(jìn)行過濾,如果包含的值滿足條件,那么還是返回這個(gè) Optional;否則返回 Optional.empty。
- map(Function<? super T, ? extends U> mapper)
- 對(duì)該值執(zhí)行提供的 get方法調(diào)用。
- flatMap(Function<? super T, Optional> mapper)
- 同上,只不過Function返回的時(shí)候就是Optional;而map是代碼里面幫忙封裝了.
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Optional.ofNullable(mapper.apply(value)); } } public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) { Objects.requireNonNull(mapper); if (!isPresent()) return empty(); else { return Objects.requireNonNull(mapper.apply(value)); } }
- orElse(T other)
如果調(diào)用對(duì)象包含值,返回該值,否則返回t。
- orElseGet(Supplier<? extends T> other)
如果調(diào)用對(duì)象包含值,返回該值,否則返回 other 獲取的值。
- orElseThrow(Supplier<? extends X> exceptionSupplier)
如果調(diào)用對(duì)象包含值,返回該值,否則拋出 other 獲取的異常。
使用案例
- 判斷對(duì)象是否存在,如果存在則執(zhí)行操作
@Test public void test1() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); Optional.ofNullable(retUser).ifPresent(x->{ System.out.println(x.getName()); System.out.println(x.getAge()); }); }
- 判斷對(duì)象是否為空,如果為空則返回默認(rèn)值
@Test public void test2() { // User user = new User(); User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); User user1 = Optional.ofNullable(user).orElse(retUser); System.out.println(user1); }
- 對(duì)對(duì)象的某一屬性獲取,如果為空則獲取默認(rèn)的,好比返回用戶頭像地址,如果沒有設(shè)置則返回一個(gè)默認(rèn)的頭像地址,如果有則添加地址返回;
@Test public void test3() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); String lowerName = Optional.ofNullable(user).map(u -> { return u.getName(); }).map(name -> { return name.toLowerCase(); }).orElse("默認(rèn)的名字"); System.out.println(lowerName); }
代碼
import lombok.Data; import lombok.ToString; import org.junit.Test; import java.util.Optional; public class OptionalTest { public static void main(String[] args) { User user = new User(); user.setName("yida"); user.setAge(18); Optional<Object> empty = Optional.empty(); Optional<User> user1 = Optional.of(user); Optional<User> user2 = Optional.ofNullable(user); } @Test public void test1() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); Optional.ofNullable(retUser).ifPresent(x->{ System.out.println(x.getName()); System.out.println(x.getAge()); }); } @Test public void test2() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); User user1 = Optional.ofNullable(user).orElse(retUser); System.out.println(user1); } @Test public void test3() { User user = null; User retUser = new User(); retUser.setName("aaa"); retUser.setAge(33); String lowerName = Optional.ofNullable(user).map(u -> { return u.getName(); }).map(name -> { return name.toLowerCase(); }).orElse("默認(rèn)的名字"); System.out.println(lowerName); } @Data @ToString private static class User{ private String name; private Integer age; } }
到此這篇關(guān)于Java中的Optional使用詳細(xì)說明的文章就介紹到這了,更多相關(guān)Java中的Optional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Swing JRadioButton單選按鈕具體使用
這篇文章主要介紹了Java Swing JRadioButton單選按鈕具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12解決IDEA中Maven下載依賴包過慢或報(bào)錯(cuò)的問題
由于公司項(xiàng)目迭代,越來越多的項(xiàng)目開始轉(zhuǎn)型新版本,由于我對(duì)Java一直不感冒,但要順應(yīng)公司項(xiàng)目要求,遂自己要逐步開始完善Java相關(guān)的知識(shí)層面,此篇是我在學(xué)習(xí)SpringBoot時(shí)對(duì)一些不懂地方及遇到問題時(shí)的記錄,需要的朋友可以參考下2024-02-02MybatisPlus處理大表查詢的實(shí)現(xiàn)步驟
在實(shí)際工作中當(dāng)指定查詢數(shù)據(jù)過大時(shí),我們一般使用分頁查詢的方式一頁一頁的將數(shù)據(jù)放到內(nèi)存處理,本文主要介紹了MybatisPlus處理大表查詢的實(shí)現(xiàn)步驟,感興趣的可以了解一下2024-08-08Java實(shí)現(xiàn)經(jīng)典捕魚達(dá)人游戲的示例代碼
《捕魚達(dá)人》是一款以深海狩獵為題材的休閑競(jìng)技游戲。本文將利用Java實(shí)現(xiàn)這一經(jīng)典的游戲,文中采用了swing技術(shù)進(jìn)行了界面化處理,需要的可以參考一下2022-02-02淺析fastjson2時(shí)間序列化和反序列化的簡(jiǎn)單使用
在項(xiàng)目中將fastjson升級(jí)為fastjson2后,我們遇到了一些與fastjson不完全兼容的問題,所以本文就來探討下fastjson2的時(shí)間序列化和反序列化的簡(jiǎn)單使用吧2025-01-01Java實(shí)現(xiàn)創(chuàng)建Zip壓縮包并寫入文件
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)創(chuàng)建Zip壓縮包并寫入文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01背包問題-動(dòng)態(tài)規(guī)劃java實(shí)現(xiàn)的分析與代碼
這篇文章主要給大家介紹了關(guān)于背包問題動(dòng)態(tài)規(guī)劃java實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12