Java中的Optional處理方法
在我們?nèi)粘5拈_發(fā)中,我們經(jīng)常會(huì)遇到 NullPointerException。如何才能優(yōu)雅的處理NPE?這里告訴大家一個(gè)較為流行的方法
java.util.Optional
使用Optional來修飾對(duì)象,表示這個(gè)對(duì)象可能為null。在使用時(shí),就要加以注意,必須要考慮該值為null的場(chǎng)景。
使用Optional構(gòu)建對(duì)象
// 創(chuàng)建一個(gè)空的car
Optional<Car> car = Optional.empty();
// 使用of創(chuàng)建,of的值一定不能是null,否則賦值階段就報(bào) NullPointerException
/**
* if (obj == null)
* throw new NullPointerException();
*/
Car car1 = new Car();
Optional<Car> ocar1 = Optional.of(car1);
// 創(chuàng)建一個(gè)可以為null的Optional,該方法支持car為null,但是會(huì)在用到car的地方拋出異常,但不是空指針異常。
Car car2 = new Car();
Optional<Car> ocar2 = Optional.ofNullable(car2);
System.out.println(ocar2.get());
Optional<Car> ocar22 = Optional.ofNullable(null);獲取Optional中的對(duì)象
1.get: 這是最不安全的方法。如果變量存在就返回,不存在的話則會(huì)拋出NoSuchElementException的異常。所以,get()的使用場(chǎng)景一定是十分確定Optional修飾的值一定是有內(nèi)容的,否則不建議使用。
/**
* public T get() {
* if (value == null) {
* throw new NoSuchElementException("No value present");
* }
* return value;
* }
*/
String name = car.getInsurance().get().getName();
System.out.println(name);2.orElse: 作用和get一樣,但是沒有值時(shí)可以使用默認(rèn)值
/**
* public T orElse(T other) {
* return value != null ? value : other;
* }
*/
String orName = car.getInsurance().orElse(new Insurance()).getName();
System.out.println(orName);3.orElseGet: orElse的延時(shí)版本。只有當(dāng)val為空時(shí),才會(huì)創(chuàng)建defleat value
/**
* public T orElseGet(Supplier<? extends T> supplier) {
* return value != null ? value : supplier.get();
* }
*/
String getElseName = car.getInsurance().orElseGet(Insurance::new).getName();
System.out.println("getElseName " + getElseName);4.orElseThrow: 和orElse類似,只是當(dāng)value不存在時(shí)拋出異常
public T orElseThrow() {
if (value == null) {
throw new NoSuchElementException("No value present");
}
return value;
}5.ifPresent: 判斷值存在之后再操作,不存在就不操作
/**
* public void ifPresent(Consumer<? super T> action) {
* if (value != null) {
* action.accept(value);
* }
* }
*/
car.getInsurance().ifPresent(ins -> {
String pname = ins.getName();
System.out.println("inPresent " + pname);
});Optional 中map和flatmap的差別
Optional<Optional<Car>> mCar = optionalPerson.map(Person::getCar); Optional<Car> flatMapCap = optionalPerson.flatMap(Person::getCar);
map
public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent()) {
return empty();
} else {
// 返回值使用Optional包裝
return Optional.ofNullable(mapper.apply(value));
}
}flatMap
public <U> Optional<U> flatMap(Function<? super T, ? extends Optional<? extends U>> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent()) {
return empty();
} else {
@SuppressWarnings("unchecked")
Optional<U> r = (Optional<U>) mapper.apply(value);
// 返回值沒有包裝,直接是Optional對(duì)象,只做了一次判null
return Objects.requireNonNull(r);
}
}到此這篇關(guān)于Java中的Optional的文章就介紹到這了,更多相關(guān)Java中的Optional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03
利用Spring Boot如何開發(fā)REST服務(wù)詳解
這篇文章主要給大家介紹了關(guān)于利用Spring Boot如何開發(fā)REST服務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
SpringBoot快速設(shè)置攔截器并實(shí)現(xiàn)權(quán)限驗(yàn)證的方法
本篇文章主要介紹了SpringBoot快速設(shè)置攔截器并實(shí)現(xiàn)權(quán)限驗(yàn)證的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
Java并發(fā)Lock接口實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了Java并發(fā)Lock接口,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
解決后端傳long類型數(shù)據(jù)到前端精度丟失問題
這篇文章主要介紹了解決后端傳long類型數(shù)據(jù)到前端精度丟失問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Maven根據(jù)不同環(huán)境打包不同配置文件的方法
這篇文章主要介紹了Maven根據(jù)不同環(huán)境打包不同配置文件的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08

