欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何深度解析java8新特性O(shè)ptional

本篇文章為大家展示了如何深度解析java8新特性O(shè)ptional,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)建站專注于企業(yè)全網(wǎng)整合營銷推廣、網(wǎng)站重做改版、城廂網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁面制作、商城網(wǎng)站定制開發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為城廂等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

下面以jdk1.8.0_111源碼為例

public final class Optional<T> {}

Optional是一個(gè)為了解決NullPointerException設(shè)計(jì)而生可以包含對(duì)象也可以包含空的容器對(duì)象。封裝了很多對(duì)空處理的方法也增加了filter、map這樣的檢索利器,其中函數(shù)式編程會(huì)有種炫酷到爆的感覺。

基礎(chǔ)測試用例對(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ì)常用場景下的double\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是用來判斷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,所以沒有執(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));
    }
}

測試示例:

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ì)超過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è)斷言語句條件的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();
    }
}

測試用例如下:

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

Java可以用來干什么

Java主要應(yīng)用于:1. web開發(fā);2. Android開發(fā);3. 客戶端開發(fā);4. 網(wǎng)頁開發(fā);5. 企業(yè)級(jí)應(yīng)用開發(fā);6. Java大數(shù)據(jù)開發(fā);7.游戲開發(fā)等。

上述內(nèi)容就是如何深度解析java8新特性O(shè)ptional,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站欄目:如何深度解析java8新特性O(shè)ptional
轉(zhuǎn)載來于:http://aaarwkj.com/article46/gojjeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站改版、網(wǎng)站建設(shè)、搜索引擎優(yōu)化、網(wǎng)站制作、網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
亚洲丰满毛茸茸毛茸茸| 国产精品大白屁股视频| 裸体性做爰免费视频网站| 国产成人亚洲精品另类动态| 中文字幕乱码人妻一二三| 亚洲综合福利视频网站| 日本熟妇一区二区三区在线视频| 亚洲欧洲日韩另类在线| 久久国产亚洲欧美日韩精品| 国产伦精品二区三区视频| 国产成年人拍拍免费视频| 91九色国产在线视频| 丰满人妻少妇精品一区二区三区| 亚洲综合中文字幕久久网址| 青青草最新网址在线观看视频| 亚洲精品伦理视频在线| 蜜桃臀视频一区二区三区| 亚洲精品熟女av影院| 国语少妇高潮对白在线| 日韩精品一区免费电影| 2022国产精品一区| 日韩在线观看精品亚洲| 国产精品99久久久久久| 青青草原在线观看网站| 日本韩国欧美成人精品| 国产农村妇女一区二区三区| 妞干网视频这里只有精品| av熟女一区二区三区| 日日夜夜添添精品视频| 在线观看91高清视频| 亚洲视频一区二区精品| 就去吻色综合一二三四| 欧美日韩福利视频在线| 中文字幕久久av一区二区| 国产精品乱人偷免费视频| 溪乱毛片一区二区三区| 日韩不卡的一区免费视频| 亚洲精品成av人在线观看| 精品在线中文字幕不卡| 国产精品国产三级国产专用| 激情网站免费在线观看|