1季二、 Optional介紹
傳統(tǒng)的寫代碼方式經(jīng)常會遇到NullPointerException数焊,這就需要我們在代碼中經(jīng)常判空扎附。而判空的寫法又會顯得很累贅杜秸,這里就可以用到Optional來簡化代碼。
① Optional是在java.util包下的一個用于代替null的一個工具類抑党;
② Optional 是個容器:它可以保存類型T的值包警,或者僅僅保存null。Optional提供很多有用的方法底靠,這樣我們就不用顯式進行空值檢測害晦。
③ Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true暑中,調(diào)用get()方法會返回該對象壹瘟。Optional 類的引入很好的解決空指針異常苟呐。
2、構(gòu)建Optional對象
① 創(chuàng)建一個空的 Optional 實例
Optional<String> emptyOptional = Optional.empty();
② 創(chuàng)建一個 Optional 實例俐筋,當(dāng) t為null時牵素,拋出NullPointerException異常
Optional<String> notNullOptional = Optional.of("aaa");
③ 創(chuàng)建一個 Optional 實例,但當(dāng) t為null時不會拋出異常澄者,而是返回一個空的實例
Optional<String> notNullOptional = Optional.ofNullable("aaa");
3笆呆、 獲取Optional中的值
獲取optional實例中的對象,當(dāng)optional 容器為空時報錯粱挡,拋出NoSuchElementException,獲取前可以使用ifPresent進行判斷赠幕。
Optional<String> optional = Optional.of("Hello optional");
System.out.println("optional get is :"+optional.get());
optional.ifPresent(System.out::println);
4、判斷方法
Optional<String> optional = Optional.of("aaa");
① 判斷optional是否為空询筏,如果空則返回false榕堰,否則返回true
System.out.println(optional.isPresent());
② 如果optional不為空,則將optional中的對象傳給Comsumer函數(shù)
optional.ifPresent(System.out::println);
③ 檢查Optional實例是否有值嫌套,如果實例非null逆屡,就返回實例值,否則返回指定的其它值
String aa = optional.orElse("haha");
System.out.println(aa);
④ 如果optional不為空踱讨,則返回optional中的對象魏蔗;如果為null,則使用Supplier函數(shù)生成默認值other
optional.orElseGet(() -> "Default Value")
orElseGet(Supplier supplier):功能與orElse一樣痹筛,只不過orElseGet參數(shù)是一個對象
⑤ 如果optional不為空莺治,則返回optional中的對象;如果為null帚稠,則拋出Supplier函數(shù)生成的異常
String bb = optional.orElseThrow(() -> new Exception("拋出異常"));
⑥ filter(Predicate p):如果有值并且滿足條件谣旁,就返回該Optional,否則返回空Optional
Optional<User> result = Optional.ofNullable(user).filter(u -> u.getEmail() != null && u.getEmail().contains("@"));
⑦ 如果optional不為空滋早,則將optional中的對象 t 映射成另外一個對象 u榄审,并將 u 存放到一個新的optional容器中。
Optional<Integer> notNullToInteger = notNullOptional.map((value) -> 1);