這篇文章主要介紹了java8新特性之Optional的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
石景山網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
本文以jdk1.8.0_111源碼為例
public final class Optional<T> {}
Optional是一個(gè)為了解決NullPointerException設(shè)計(jì)而生可以包含對(duì)象也可以包含空的容器對(duì)象。封裝了很多對(duì)空處理的方法也增加了filter、map這樣的檢索利器,其中函數(shù)式編程會(huì)有種炫酷到爆的感覺(jué)。
基礎(chǔ)測(cè)試用例對(duì)象:
public class Java8OptionalTest { List<String> stringList = null; ICar car = new WeiLaiCar(); } public class WeiLaiCar implements ICar { Integer wheels = new Integer(4); }
Api中提供的4種optional
最核心的當(dāng)屬Optional對(duì)象,泛型的引入支持了所有對(duì)象類型,又增加對(duì)常用場(chǎng)景下的dubbo\int\long進(jìn)行擴(kuò)展。重點(diǎn)介紹一下Optional對(duì)象的方法其他三個(gè)類似。
public final class Optional<T> {
public final class OptionalDouble {
public final class OptionalInt {
public final class OptionalLong {
@FunctionalInterface
Predicate\Consumer\Supplier三個(gè)接口都是函數(shù)式接口
靜態(tài)方法of
private Optional() { this.value = null; }
構(gòu)造方法被private,不能new但提供了of這樣的靜態(tài)方法去初始化類;
public static <T> Optional<T> of(T value) { return new Optional<>(value); } public static <T> Optional<T> ofNullable(T value) { return value == null ? empty() : of(value); } public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; }
1、empty支持你去創(chuàng)建一個(gè)空的optional類,這樣的類直接get()會(huì)報(bào)錯(cuò):java.util.NoSuchElementException: No value present
2、of(x)傳入的對(duì)象不能為null,而ofNullable(x)是支持傳入null的對(duì)象,一般用這兩個(gè)比較多。
present 方法
isPresent是用來(lái)判斷optional中對(duì)象是否為null,ifPresent的參數(shù)是當(dāng)對(duì)象不為null時(shí)執(zhí)行的lamdba表達(dá)式。
public boolean isPresent() { return value != null; } public void ifPresent(Consumer<? super T> consumer) { if (value != null) consumer.accept(value); }
示例詳解介紹了ifPresent特性:
Java8OptionalTest test = new Java8OptionalTest(); Optional<Java8OptionalTest> optional = Optional.of(test); pringTest(optional.isPresent()); //true optional.ifPresent( a -> pringTest(a.getCar().getClass().getName())); //com.ts.util.optional.WeiLaiCar optional.ifPresent( a -> Optional.ofNullable(a.getStringList()).ifPresent(b -> pringTest("StringList:" + (b == null)))); //第一級(jí)的ifPresent是存在test對(duì)象,所以執(zhí)行了lambda表達(dá)式,而第二級(jí)的ifPresent的stringList是null,所以沒(méi)有執(zhí)行表達(dá)式 optional.ifPresent( a -> Optional.ofNullable(a.getCar()).ifPresent(b -> pringTest("car:" + (b == null)))); //car:false //第二級(jí)ifPresent的car對(duì)象是存在的,所以第二級(jí)的表達(dá)式執(zhí)行了
map 方法
源碼提供了兩種map和flatMap。
map方法的參數(shù)是個(gè)當(dāng)包含的對(duì)象不為null時(shí)才執(zhí)行的lambda表達(dá)式,返回該表達(dá)式執(zhí)行結(jié)果的封裝optional對(duì)象,同理支持鏈?zhǔn)秸{(diào)用,逐層深入和遞歸遞進(jìn)很像;
flatMap區(qū)別在于lambda表達(dá)式的返回結(jié)果必須主動(dòng)包裹Optinoal,否則報(bào)錯(cuò)
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)); } }
測(cè)試示例:
Java8OptionalTest test = new Java8OptionalTest(); Optional<Java8OptionalTest> optional = Optional.of(test); Optional opt1 = optional.map( a -> a.getCar()); pringTest(opt1.get()); //com.ts.util.optional.WeiLaiCar@5d6f64b1 int wheel = 0;//傳統(tǒng)null判斷寫法 if(test != null){ if(test.getCar() != null){//實(shí)際業(yè)務(wù)里面層級(jí)也許會(huì)超過(guò)3層 wheel = test.getCar().getWheelCount(); } } pringTest("傳統(tǒng):"+wheel); //傳統(tǒng):4 Optional opt2 = optional.map( a -> a.getCar()).map(b -> b.getWheelCount());//Optional支持下的寫法 pringTest("optinal:"+opt2.get()); //optinal:4 Optional opt3 = optional.map( a -> a.getStringList()).map(b -> b.size()); pringTest(opt3); //Optional.empty Optional opt4 = optional.flatMap(a -> Optional.of(a.getCar()));//主動(dòng)包裹Optional對(duì)象 pringTest(opt4); //Optional[com.ts.util.optional.WeiLaiCar@5d6f64b1] Optional opt5 = optional.flatMap(a -> Optional.of(a.getCar())).flatMap(b -> Optional.ofNullable(b.getWheelCount())); pringTest(opt5); //Optional[4]
filter 方法
源碼如下:
public Optional<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); if (!isPresent()) return this; else return predicate.test(value) ? this : empty(); }
filter方法傳入一個(gè)斷言語(yǔ)句條件的lambda表達(dá)式,返回一個(gè)原對(duì)象的optional包裝,所以支持鏈?zhǔn)秸{(diào)用;只要記住這三點(diǎn)你便掌握如何使用了。
看下面的例子:
Java8OptionalTest test = new Java8OptionalTest(); Optional<Java8OptionalTest> optional = Optional.of(test); Optional result = optional.filter( a -> a.getCar() != null).filter( b -> b.getClass().getName() != null); pringTest(result.isPresent()? result.get().getClass().getName(): result.isPresent()); //com.ts.util.Java8OptionalTest Optional result1 = optional.filter( a -> a.getStringList() != null); pringTest(result1.get()); //java.util.NoSuchElementException: No value present
orElse 方法
Api提供了三個(gè)方法。
orElse 當(dāng)optional內(nèi)對(duì)象為null就返回這個(gè)參數(shù),比較像很多默認(rèn)值設(shè)置;
orElseGet 基本同orElse,區(qū)別是傳入?yún)?shù)支持lambda表達(dá)式,返回的就是表達(dá)式執(zhí)行結(jié)果;
orElseThrow 也是傳入lambda表達(dá)式,但是表達(dá)式是拋出異常
public T orElse(T other) { return value != null ? value : other; } public T orElseGet(Supplier<? extends T> other) { return value != null ? value : other.get(); } public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X { if (value != null) { return value; } else { throw exceptionSupplier.get(); } }
測(cè)試用例如下:
Java8OptionalTest one = null; Java8OptionalTest test = new Java8OptionalTest(); Optional<Java8OptionalTest> optional = Optional.ofNullable(one); pringTest(optional); //Optional.empty pringTest(optional.orElse(test)); //com.ts.util.Java8OptionalTest@5197848c pringTest(optional.orElseGet(() -> new Java8OptionalTest())); //com.ts.util.Java8OptionalTest@5d6f64b1 pringTest(optional.orElseThrow(() -> new RuntimeException("orElseThrow"))); //java.lang.RuntimeException: orElseThrow
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“java8新特性之Optional的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
本文題目:java8新特性之Optional的示例分析
URL鏈接:http://m.newbst.com/article44/ghogee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、外貿(mào)建站、網(wǎng)站維護(hù)、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)