成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

java8源代碼的簡單介紹

如何更好地使用Java 8的Optional

我們知道 Java 8 增加了一些很有用的 API, 其中一個就是 Optional. 如果對它不稍假探索, 只是輕描淡寫的認為它可以優(yōu)雅的解決 NullPointException 的問題, 于是代碼就開始這么寫了

創(chuàng)新互聯(lián)公司一直在為企業(yè)提供服務(wù),多年的磨煉,使我們在創(chuàng)意設(shè)計,全網(wǎng)整合營銷推廣到技術(shù)研發(fā)擁有了開發(fā)經(jīng)驗。我們擅長傾聽企業(yè)需求,挖掘用戶對產(chǎn)品需求服務(wù)價值,為企業(yè)制作有用的創(chuàng)意設(shè)計體驗。核心團隊擁有超過十余年以上行業(yè)經(jīng)驗,涵蓋創(chuàng)意,策化,開發(fā)等專業(yè)領(lǐng)域,公司涉及領(lǐng)域有基礎(chǔ)互聯(lián)網(wǎng)服務(wù)成都服務(wù)器托管重慶APP軟件開發(fā)、手機移動建站、網(wǎng)頁設(shè)計、網(wǎng)絡(luò)整合營銷。

OptionalUser user = ......

if (user.isPresent()) {

return user.getOrders();

} else {

return Collections.emptyList();

}

那么不得不說我們的思維仍然是在原地踏步, 只是本能的認為它不過是 User 實例的包裝, 這與我們之前寫成

User user = .....

if (user != null) {

return user.getOrders();

} else {

return Collections.emptyList();

}

實質(zhì)上是沒有任何分別. 這就是我們將要講到的使用好 java 8 Optional 類型的正確姿勢.

在里約奧運之時, 新聞一再提起五星紅旗有問題, 可是我怎么看都看不出來有什么問題, 后來才道是小星星膜拜中央的姿勢不對. 因此我們千萬也別對自己習(xí)以為常的事情覺得理所當然, 絲毫不會覺得有何不妥, 換句話說也就是當我們切換到 Java 8 的 Optional 時, 不能繼承性的對待過往 null 時的那種思維, 應(yīng)該掌握好新的, 正確的使用 Java 8 Optional 的正確姿勢.

直白的講, 當我們還在以如下幾種方式使用 Optional 時, 就得開始檢視自己了

調(diào)用 isPresent() 方法時

調(diào)用 get() 方法時

Optional 類型作為類/實例屬性時

Optional 類型作為方法參數(shù)時

isPresent() 與 obj != null 無任何分別, 我們的生活依然在步步驚心. 而沒有 isPresent() 作鋪墊的 get() 調(diào)用在 IntelliJ IDEA 中會收到告警

Reports calls to java.util.Optional.get() without first checking with a isPresent() call if a value is available. If the Optional does not contain a value, get() will throw an exception. (調(diào)用 Optional.get() 前不事先用 isPresent() 檢查值是否可用. 假如 Optional 不包含一個值, get() 將會拋出一個異常)

把 Optional 類型用作屬性或是方法參數(shù)在 IntelliJ IDEA 中更是強力不推薦的

Reports any uses of java.util.OptionalT, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong or com.google.common.base.Optional as the type for a field or a parameter. Optional was designed to provide a limited mechanism for library method return types where there needed to be a clear way to represent “no result”. Using a field with type java.util.Optional is also problematic if the class needs to be Serializable, which java.util.Optional is not. (使用任何像 Optional 的類型作為字段或方法參數(shù)都是不可取的. Optional 只設(shè)計為類庫方法的, 可明確表示可能無值情況下的返回類型. Optional 類型不可被序列化, 用作字段類型會出問題的)

所以 Optional 中我們真正可依賴的應(yīng)該是除了 isPresent() 和 get() 的其他方法:

publicU OptionalU map(Function? super T, ? extends U mapper)

public T orElse(T other)

public T orElseGet(Supplier? extends T other)

public void ifPresent(Consumer? super T consumer)

public OptionalT filter(Predicate? super T predicate)

publicU OptionalU flatMap(Function? super T, OptionalU mapper)

public X extends Throwable T orElseThrow(Supplier? extends X exceptionSupplier) throws X

我略有自信的按照它們大概使用頻度對上面的方法排了一下序.

先又不得不提一下 Optional 的三種構(gòu)造方式: Optional.of(obj), Optional.ofNullable(obj) 和明確的 Optional.empty()

Optional.of(obj): 它要求傳入的 obj 不能是 null 值的, 否則還沒開始進入角色就倒在了 NullPointerException 異常上了.

Optional.ofNullable(obj): 它以一種智能的, 寬容的方式來構(gòu)造一個 Optional 實例. 來者不拒, 傳 null 進到就得到 Optional.empty(), 非 null 就調(diào)用 Optional.of(obj).

那是不是我們只要用 Optional.ofNullable(obj) 一勞永逸, 以不變應(yīng)二變的方式來構(gòu)造 Optional 實例就行了呢? 那也未必, 否則 Optional.of(obj) 何必如此暴露呢, 私有則可?

我本人的觀點是: 1. 當我們非常非常的明確將要傳給 Optional.of(obj) 的 obj 參數(shù)不可能為 null 時, 比如它是一個剛 new 出來的對象(Optional.of(new User(...))), 或者是一個非 null 常量時; 2. 當想為 obj 斷言不為 null 時, 即我們想在萬一 obj 為 null 立即報告 NullPointException 異常, 立即修改, 而不是隱藏空指針異常時, 我們就應(yīng)該果斷的用 Optional.of(obj) 來構(gòu)造 Optional 實例, 而不讓任何不可預(yù)計的 null 值有可乘之機隱身于 Optional 中.

現(xiàn)在才開始怎么去使用一個已有的 Optional 實例, 假定我們有一個實例 OptionalUser user, 下面是幾個普遍的, 應(yīng)避免 if(user.isPresent()) { ... } else { ... } 幾中應(yīng)用方式.

存在即返回, 無則提供默認值

return user.orElse(null); //而不是 return user.isPresent() ? user.get() : null;

return user.orElse(UNKNOWN_USER);

存在即返回, 無則由函數(shù)來產(chǎn)生

return user.orElseGet(() - fetchAUserFromDatabase()); //而不要 return user.isPresent() ? user: fetchAUserFromDatabase();

存在才對它做點什么

user.ifPresent(System.out::println);

//而不要下邊那樣

if (user.isPresent()) {

System.out.println(user.get());

}

map 函數(shù)隆重登場

當 user.isPresent() 為真, 獲得它關(guān)聯(lián)的 orders, 為假則返回一個空集合時, 我們用上面的 orElse, orElseGet 方法都乏力時, 那原本就是 map 函數(shù)的責任, 我們可以這樣一行

return user.map(u - u.getOrders()).orElse(Collections.emptyList())

//上面避免了我們類似 Java 8 之前的做法

if(user.isPresent()) {

return user.get().getOrders();

} else {

return Collections.emptyList();

}

map 是可能無限級聯(lián)的, 比如再深一層, 獲得用戶名的大寫形式

return user.map(u - u.getUsername())

.map(name - name.toUpperCase())

.orElse(null);

這要擱在以前, 每一級調(diào)用的展開都需要放一個 null 值的判斷

User user = .....

if(user != null) {

String name = user.getUsername();

if(name != null) {

return name.toUpperCase();

} else {

return null;

}

} else {

return null;

}

針對這方面 Groovy 提供了一種安全的屬性/方法訪問操作符 ?.

user?.getUsername()?.toUpperCase();

Swift 也有類似的語法, 只作用在 Optional 的類型上.

用了 isPresent() 處理 NullPointerException 不叫優(yōu)雅, 有了 orElse, orElseGet 等, 特別是 map 方法才叫優(yōu)雅.

其他幾個, filter() 把不符合條件的值變?yōu)?empty(), flatMap() 總是與 map() 方法成對的, orElseThrow() 在有值時直接返回, 無值時拋出想要的異常.

一句話小結(jié): 使用 Optional 時盡量不直接調(diào)用 Optional.get() 方法, Optional.isPresent() 更應(yīng)該被視為一個私有方法, 應(yīng)依賴于其他像 Optional.orElse(), Optional.orElseGet(), Optional.map() 等這樣的方法.

最后, 最好的理解 Java 8 Optional 的方法莫過于看它的源代碼 java.util.Optional, 閱讀了源代碼才能真真正正的讓你解釋起來最有底氣, Optional 的方法中基本都是內(nèi)部調(diào)用 isPresent() 判斷, 真時處理值, 假時什么也不做.

如何用maven將java8寫的代碼編譯為java6平臺的

在一般的Java應(yīng)用開發(fā)過程中,開發(fā)人員使用Java的方式比較簡單。打開慣用的IDE,編寫Java源代碼,再利用IDE提供的功能直接運行Java 程序就可以了。這種開發(fā)模式背后的過程是:開發(fā)人員編寫的是Java源代碼文件(.java),IDE會負責調(diào)用Java的編譯器把Java源代碼編譯成平臺無關(guān)的字節(jié)代碼(byte code),以類文件的形式保存在磁盤上(.class)。Java虛擬機(JVM)會負責把Java字節(jié)代碼加載并執(zhí)行。Java通過這種方式來實現(xiàn)其“編寫一次,到處運行(Write once, run anywhere)” 的目標。Java類文件中包含的字節(jié)代碼可以被不同平臺上的JVM所使用。Java字節(jié)代碼不僅可以以文件形式存在于磁盤上,也可以通過網(wǎng)絡(luò)方式來下載,還可以只存在于內(nèi)存中。JVM中的類加載器會負責從包含字節(jié)代碼的字節(jié)數(shù)組(byte[])中定義出Java類。在某些情況下,可能會需要動態(tài)的生成 Java字節(jié)代碼,或是對已有的Java字節(jié)代碼進行修改。這個時候就需要用到本文中將要介紹的相關(guān)技術(shù)。首先介紹一下如何動態(tài)編譯Java源文件。

安裝java8玩我的世界在開發(fā)工具源代碼公共jre選哪個

單純玩游戲安裝jre就好了,但是如果要在你開發(fā)用的電腦上玩mc的話。

建議你直接安裝jdk,jdk里面就包含jre的。

上述是建立在你電腦同時玩mc和開發(fā)java程序的情況下的。

如果是開發(fā)的比如其他的語言程序,用不到j(luò)ava開發(fā)環(huán)境的那種,就直接裝jre就好了。

當前標題:java8源代碼的簡單介紹
瀏覽路徑:http://jinyejixie.com/article26/dssdccg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、搜索引擎優(yōu)化、品牌網(wǎng)站設(shè)計網(wǎng)站內(nèi)鏈、微信小程序做網(wǎng)站

廣告

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

商城網(wǎng)站建設(shè)
浏阳市| 依兰县| 英超| 福泉市| 萍乡市| 铜梁县| 霍城县| 库伦旗| 津市市| 宜宾县| 牟定县| 上林县| 广丰县| 涞源县| 连平县| 绥化市| 天峻县| 淮北市| 岚皋县| 泽州县| 阳谷县| 林芝县| 阜南县| 长泰县| 开封县| 桃江县| 台南县| 东乡族自治县| 班玛县| 砀山县| 长子县| 清镇市| 从化市| 柳州市| 靖宇县| 彰武县| 库车县| 山西省| 称多县| 吐鲁番市| 巴林左旗|