本篇內(nèi)容主要講解“如何正確使用Optional解決null安全問題”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“如何正確使用Optional解決null安全問題”吧!
創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今,先為雨湖等服務(wù)建站,雨湖等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為雨湖企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
使用Optional,我們就可以把下面這樣的代碼進(jìn)行改寫。
public static String getName(User u) {
if (u == null)
return "Unknown";
return u.name;
}
不過,千萬不要改寫成這副樣子。
public static String getName(User u) {
Optional
user = Optional.ofNullable(u); if (!user.isPresent())
return "Unknown";
return user.get().name;
}
這樣改寫非但不簡(jiǎn)潔,而且其操作還是和第一段代碼一樣。無非就是用isPresent方法來替代u==null。這樣的改寫并不是Optional正確的用法,我們?cè)賮砀膶懸淮巍?/p>
public static String getName(User u) {
return Optional.ofNullable(u)
.map(user->user.name)
.orElse("Unknown");
}
這樣才是正確使用Optional的姿勢(shì)。那么按照這種思路,我們可以安心的進(jìn)行鏈?zhǔn)秸{(diào)用,而不是一層層判斷了??匆欢未a:
public static String getChampionName(Competition comp) throws IllegalArgumentException {
if (comp != null) {
CompResult result = comp.getResult();
if (result != null) {
User champion = result.getChampion();
if (champion != null) {
return champion.getName();
}
}
}
throw new IllegalArgumentException("The value of param comp isn't available.");
}
由于種種原因(比如:比賽還沒有產(chǎn)生冠軍、方法的非正常調(diào)用、某個(gè)方法的實(shí)現(xiàn)里埋藏的大禮包等等),我們并不能開心的一路comp.getResult().getChampion().getName()到底。而其他語(yǔ)言比如kotlin,就提供了在語(yǔ)法層面的操作符加持:comp?.getResult()?.getChampion()?.getName()。所以講道理在Java里我們?cè)趺崔k!
讓我們看看經(jīng)過Optional加持過后,這些代碼會(huì)變成什么樣子。
public static String getChampionName(Competition comp) throws IllegalArgumentException {
return Optional.ofNullable(comp)
.map(c->c.getResult())
.map(r->r.getChampion())
.map(u->u.getName())
.orElseThrow(()->new IllegalArgumentException("The value of param comp isn't available."));
}
這就很舒服了。Optional給了我們一個(gè)真正優(yōu)雅的Java風(fēng)格的方法來解決null安全問題。雖然沒有直接提供一個(gè)操作符寫起來短,但是代碼看起來依然很爽很舒服。更何況?.這樣的語(yǔ)法好不好看還見仁見智呢。
還有很多不錯(cuò)的使用姿勢(shì),比如為空則不打印可以這么寫:
string.ifPresent(System.out::println);
Optional的魅力還不止于此,Optional還有一些神奇的用法,比如Optional可以用來檢驗(yàn)參數(shù)的合法性。
public void setName(String name) throws IllegalArgumentException {
this.name = Optional.ofNullable(name).filter(User::isNameValid)
.orElseThrow(()->new IllegalArgumentException("Invalid username."));
}
這樣寫參數(shù)合法性檢測(cè),應(yīng)該足夠優(yōu)雅了吧。
到此,相信大家對(duì)“如何正確使用Optional解決null安全問題”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!