日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jdk1.8新特性(四)——Optional

發(fā)布時間:2024/4/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jdk1.8新特性(四)——Optional 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在我們的開發(fā)中,NullPointerException可謂是隨時隨處可見,為了避免空指針異常,我們常常需要進行一
些防御式的檢查,所以在代碼中常常可見if(obj != null) 這樣的判斷。JDK1.8為我們提供了
一個Optional類,Optional類能讓我們省掉繁瑣的非空的判斷。

Optional中的方法匯總

使用示例:

package com.example.jdknewuse;import java.util.Optional;/*** @author: liumengbing* @date: 2019/02/21 19:51**/ public class OptionalTest {public static void main(String[] args){/*** of()方法*///創(chuàng)建一個值為張三的String類型的OptionalOptional<String> ofOptional = Optional.of("張三");//如果我們用of方法創(chuàng)建Optional對象時,所傳入的值為null,則拋出NullPointerExceptionOptional<String> nullOptional = Optional.of(null);/*** ofNullable()方法*///為指定的值創(chuàng)建Optional對象,不管所傳入的值為null不為null,創(chuàng)建的時候都不會報錯Optional<String> nullOptional = Optional.ofNullable(null);Optional<String> nullOptional = Optional.ofNullable("lisi");/*** empty()方法*///創(chuàng)建一個空的String類型的Optional對象Optional<String> emptyOptional = Optional.empty();/*** get()方法:* 如果我們創(chuàng)建的Optional對象中有值存在則返回此值,如果沒有值存在,則會拋出NoSuchElementException異常。*/Optional<String> stringOptional = Optional.of("張三");System.out.println(stringOptional.get());//注意:若Optional是空的,調(diào)用get()方法則會拋出NoSuchElementException異常Optional<String> emptyOptional2 = Optional.empty();System.out.println(emptyOptional.get());/*** orElse()方法:* 如果創(chuàng)建的Optional中有值存在,則返回此值,否則返回一個默認值*/Optional<String> stringOptional = Optional.of("張三");System.out.println(stringOptional.orElse("zhangsan"));Optional<String> emptyOptional = Optional.empty();System.out.println(emptyOptional.orElse("李四"));/*** orElseGet()方法:* 如果創(chuàng)建的Optional中有值存在,則返回此值,否則返回一個由Supplier接口生成的值*/Optional<String> stringOptional = Optional.of("張三");System.out.println(stringOptional.orElseGet(() -> "zhangsan"));Optional<String> emptyOptional = Optional.empty();System.out.println(emptyOptional.orElseGet(() -> "orElseGet"));/*** orElseThrow()方法:* 如果創(chuàng)建的Optional中有值存在,則返回此值,否則拋出一個由指定的Supplier接口生成的異常*/Optional<String> stringOptional = Optional.of("張三");System.out.println(stringOptional.orElseThrow(CustomException::new));Optional<String> emptyOptional = Optional.empty();System.out.println(emptyOptional.orElseThrow(CustomException::new));private static class CustomException extends RuntimeException {private static final long serialVersionUID = -4399699891687593264L;public CustomException() {super("自定義異常");}public CustomException(String message) {super(message);}}/*** filter()方法:* 如果創(chuàng)建的Optional中的值滿足filter中的條件,則返回包含該值的Optional對象,否則返回一個空的Optional對象;** 注意:* Optional中的filter方法和Stream中的filter方法是有點不一樣的,Stream中的filter方法是對一堆元素進* 行過濾,而Optional中的filter方法只是對一個元素進行過濾,可以把Optional看成是最多只包含一個元素的Stream。*/Optional<String> stringOptional = Optional.of("zhangsan");System.out.println(stringOptional.filter(e -> e.length() > 5).orElse("王五"));stringOptional = Optional.empty();System.out.println(stringOptional.filter(e -> e.length() > 5).orElse("lisi"));/*** map()方法:* 如果創(chuàng)建的Optional中的值存在,對該值執(zhí)行提供的Function函數(shù)調(diào)用*///map方法執(zhí)行傳入的lambda表達式參數(shù)對Optional實例的值進行修改,修改后的返回值仍然是一個Optional對象Optional<String> stringOptional = Optional.of("zhangsan");System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("失敗"));stringOptional = Optional.empty();System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("失敗"));/*** flatMap()方法:* 如果創(chuàng)建的Optional中的值存在,就對該值執(zhí)行提供的Function函數(shù)調(diào)用,返回一個Optional類型的值,否* 則就返回一個空的Optional對象.flatMap與map(Funtion)方法類似,區(qū)別在于flatMap中的mapper返回值必須是Optional,* map方法的mapping函數(shù)返回值可以是任何類型T。調(diào)用結(jié)束時,flatMap不會對結(jié)果用Optional封裝*///map方法中的lambda表達式返回值可以是任意類型,在map函數(shù)返回之前會包裝為Optional。但flatMap方法中的lambda表達式返回值必須是Optionl實例Optional<String> stringOptional = Optional.of("zhangsan");System.out.println(stringOptional.flatMap(e -> Optional.of("lisi")).orElse("失敗"));stringOptional = Optional.empty();System.out.println(stringOptional.flatMap(e -> Optional.empty()).orElse("失敗"));/*** ifPresent()方法*///ifPresent方法的參數(shù)是一個Consumer的實現(xiàn)類,Consumer類包含一個抽象方法,該抽象方法對傳入的值進行處理,只處理沒有返回值。Optional<String> stringOptional = Optional.of("tom");System.out.println(stringOptional.get());//tomstringOptional.ifPresent(e-> {e = e + "sub";System.out.println(e);//tomsub});System.out.println(stringOptional.get());//tom} }

特別說明:

of方法,就是提供一個static方法,方法名稱叫of,方法的返回值返回當前類,并且把構(gòu)造函數(shù)設(shè)置為私有private,用靜態(tài)of方法來代替構(gòu)造函數(shù)。

public class User {private String username;private Integer age;private User() {}public static User of() {return new User();}private User(String username, Integer age) {this.username = username;this.age = age;}public static User of(String username, Integer age) {return new User(username, age);} }

總結(jié)

以上是生活随笔為你收集整理的jdk1.8新特性(四)——Optional的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。