Java9新特性Java.util.Optional優(yōu)化與增強(qiáng)解析
我計(jì)劃在后續(xù)的一段時(shí)間內(nèi),寫(xiě)一系列關(guān)于java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,但是還是有很多的特性值得關(guān)注。期待您能關(guān)注我,我將把java 9 寫(xiě)成一系列的文章,大概十篇左右,本文是第7篇。
java9版本特性資源自動(dòng)關(guān)閉的語(yǔ)法增強(qiáng)
Java9版本新特性同一個(gè)Jar支持多JDK版本運(yùn)行
java9新特性Reactive Stream響應(yīng)式編程 API
java9新特性Collection集合類的增強(qiáng)與優(yōu)化方法示例
Java9新特性Stream流API優(yōu)化與增強(qiáng)
Java9新特性對(duì)HTTP2協(xié)議支持與非阻塞HTTP API
java.util.Optional
是在Java 8版本中新增的類,一定程度上可以改善編程過(guò)程中的NullPointException的問(wèn)題。在Java 9中對(duì)這個(gè)類新增了一些方法進(jìn)行增強(qiáng),下面我們一起來(lái)看一下,順便也回顧一下在Java 8中它的用法。
一、Java9的ifPresentOrElse(Consumer,Runnable)
1.1.Java 9 中的增強(qiáng)
如果存在值,則此新方法將執(zhí)行給定的Consumer操作,否則運(yùn)行給定的Runnable操作。下面的代碼先使用Java 8的的Stream流過(guò)濾3的倍數(shù),然后通過(guò)findFirst找到第一個(gè)3的倍數(shù)。如果找到一個(gè)這樣的值,就print控制臺(tái)打印出來(lái);如果沒(méi)找到一個(gè)這樣的值,就輸出"沒(méi)有找到3的倍數(shù)"
ifPresentOrElse(Consumer,Runnable)的語(yǔ)義可以解釋為:ifPresent就Consumer,OrElse就Runnable。這是Java 9 才有的增強(qiáng)方法。
IntStream.of(1, 2, 4) .filter(i -> i % 3 == 0) .findFirst() .ifPresentOrElse(System.out::println, () -> { System.out.println("沒(méi)有找到3的倍數(shù)"); });
在1、2、4中沒(méi)有3的倍數(shù),所以輸出結(jié)果如下
沒(méi)有找到3的倍數(shù)
如果是下面的2、6、8數(shù)組被過(guò)濾,最終控制臺(tái)輸出結(jié)果為:6
IntStream.of(2, 6, 8) .filter(i -> i % 3 == 0) .findFirst() .ifPresentOrElse(System.out::println, () -> { System.out.println("沒(méi)有找到3的倍數(shù)"); }); // 6
1.2.回顧一下Java 8中的寫(xiě)法
Java 8 Optional.isPresent():
如果使用Java 8 ,沒(méi)有ifPresentOrElse(Consumer,Runnable)
方法,上文中同樣的代碼你應(yīng)該是這樣寫(xiě)的:自己去寫(xiě)if和else進(jìn)行判斷。同樣輸出:沒(méi)有找到3的倍數(shù)
OptionalInt opt = IntStream.of(1, 2, 4) .filter(i -> i % 3 == 0) .findFirst(); if (opt.isPresent()) { System.out.println(opt.getAsInt()); } else { System.out.println("沒(méi)有找到3的倍數(shù)"); }
Java 8 Optional.ifPresent():
ifPresent()
方法在值不存在的時(shí)候,沒(méi)有提供一個(gè)可選的操作。所以下面的代碼在執(zhí)行之后,沒(méi)有orElse動(dòng)作,沒(méi)有任何輸出,這樣不是很友好。
IntStream.of(1, 2, 4) .filter(i -> i % 3 == 0) .findFirst() .ifPresent(System.out::println);
Java 8 Optional.orElse():
orElse()
方法在value返回值為空的之后,給出一個(gè)默認(rèn)值。下文代碼中給出一個(gè)默認(rèn)值-1。
int result = IntStream.of(1, 2, 4) .filter(i -> i % 3 == 0) .findFirst() .orElse(-1); System.out.println(result); //-1
二、Java9的Optional.or(Supplier)
該方法在找不到值的時(shí)候,生成一個(gè)新的Optional出來(lái)。下文代碼過(guò)濾數(shù)組[‘a’, ‘b’, ‘c’],isDigit判斷數(shù)組中是否有數(shù)字字符,明顯沒(méi)有,所以findFirst找不到一個(gè)這樣的值。所以生成一個(gè)默認(rèn)值: Optional.of('0')
char digit = Stream.of('a', 'b', 'c') .filter(e -> Character.isDigit(e)) .findFirst() .or(() -> Optional.of('0')).get(); System.out.println(digit); //0
Java8 中的 orElseGet()
Java 8中的Optional.orElseGet()
方法也具備同樣的功能。下文代碼過(guò)濾數(shù)組[‘a’, ‘b’, ‘c’],isDigit判斷數(shù)組中是否有數(shù)字字符,明顯沒(méi)有,所以findFirst找不到一個(gè)這樣的值。所以通過(guò)orElseGet獲取一個(gè)默認(rèn)值: '0'
char result = Stream.of('a', 'b', 'c') .filter(c -> Character.isDigit(c)) .findFirst() .orElseGet(()->'0'); System.out.println(result); //0
三、Java9的Optional.stream()
在本例中Optional.stream()
方法返回僅包含一個(gè)最大值元素的Stream流。如果該值不存在,則返回空Stream:
OptionalInt opt1 = IntStream.of(2, 5, 6).max(); //求最大值 OptionalInt opt2 = IntStream.of(1, 3, 7).max(); //求最大值 IntStream.concat(opt1.stream(), opt2.stream()) //將2個(gè)流合并 .forEach(System.out::println); //將合并后的流數(shù)據(jù)打印
控制臺(tái)輸出的結(jié)果如下:
6
7
以上就是Java9新特性Java.util.Optional優(yōu)化與增強(qiáng)解析的詳細(xì)內(nèi)容,更多關(guān)于Java9新特性O(shè)ptional增強(qiáng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java集合和IO流實(shí)現(xiàn)水果攤項(xiàng)目
最近閑來(lái)無(wú)事,使用java基礎(chǔ)知識(shí)集合和IO流做了一個(gè)簡(jiǎn)單的小項(xiàng)目,水果攤項(xiàng)目,用到GUI和Mysql數(shù)據(jù)庫(kù)搭建,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-06-06使用IDEA開(kāi)發(fā)配置Java Web的初始化過(guò)程
該教程使用idea開(kāi)發(fā)工具初始化javaweb項(xiàng)目,該運(yùn)行在tomcat服務(wù)器上通過(guò)配置項(xiàng)目環(huán)境變量保證tomcat正常啟動(dòng),具體操作配置教程參考下本文2021-06-06Java中使用異或語(yǔ)句實(shí)現(xiàn)兩個(gè)變量的互換
這篇文章主要介紹了Java中使用異或語(yǔ)句實(shí)現(xiàn)兩個(gè)變量的互換,本文直接給出代碼實(shí)例以及運(yùn)行結(jié)果,需要的朋友可以參考下2015-06-06詳解 Java Maximum redirects (100) exceeded
這篇文章主要介紹了詳解 Java Maximum redirects (100) exceeded的相關(guān)資料,需要的朋友可以參考下2017-05-05關(guān)于Java8的foreach中使用return/break/continue產(chǎn)生的問(wèn)題
這篇文章主要介紹了關(guān)于Java8的foreach()中使用return/break/continue產(chǎn)生的問(wèn)題,在使用foreach()處理集合時(shí)不能使用break和continue這兩個(gè)方法,也就是說(shuō)不能按照普通的for循環(huán)遍歷集合時(shí)那樣根據(jù)條件來(lái)中止遍歷,需要的朋友可以參考下2023-10-10IntelliJ IDEA 中g(shù)it的使用圖文教程
本文通過(guò)圖文并茂的形式給大家介紹了IntelliJ IDEA 中g(shù)it的使用,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-02-02