最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8新特性Stream的完全使用指南

 更新時(shí)間:2020年05月31日 10:43:53   作者:MartinDai  
這篇文章主要給大家介紹了關(guān)于Java8新特性Stream的完全使用指南,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

什么是Stream

Stream是Java 1.8版本開(kāi)始提供的一個(gè)接口,主要提供對(duì)數(shù)據(jù)集合使用流的方式進(jìn)行操作,流中的元素不可變且只會(huì)被消費(fèi)一次,所有方法都設(shè)計(jì)成支持鏈?zhǔn)秸{(diào)用。使用Stream API可以極大生產(chǎn)力,寫(xiě)出高效率、干凈、簡(jiǎn)潔的代碼。

如何獲得Stream實(shí)例

Stream提供了靜態(tài)構(gòu)建方法,可以基于不同的參數(shù)創(chuàng)建返回Stream實(shí)例

使用Collection的子類(lèi)實(shí)例調(diào)用stream()或者parallelStream()方法也可以得到Stream實(shí)例,兩個(gè)方法的區(qū)別在于后續(xù)執(zhí)行Stream其他方法的時(shí)候是單線程還是多線程

Stream<String> stringStream = Stream.of("1", "2", "3");
//無(wú)限長(zhǎng)的偶數(shù)流
Stream<Integer> evenNumStream = Stream.iterate(0, n -> n + 2);

List<String> strList = new ArrayList<>();
strList.add("1");
strList.add("2");
strList.add("3");
Stream<String> strStream = strList.stream();
Stream<String> strParallelStream = strList.parallelStream();

filter

filter方法用于根據(jù)指定的條件做過(guò)濾,返回符合條件的流

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//獲得只包含正數(shù)的流,positiveNumStream -> (1,2,3)
Stream<Integer> positiveNumStream = numStream.filter(num -> num > 0);

map

map方法用于將流中的每個(gè)元素執(zhí)行指定的轉(zhuǎn)換邏輯,返回其他類(lèi)型元素的流

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//轉(zhuǎn)換成字符串流
Stream<String> strStream = numStream.map(String::valueOf);

mapToInt mapToLong mapToDouble

這三個(gè)方法是對(duì)map方法的封裝,返回的是官方為各個(gè)類(lèi)型單獨(dú)定義的Stream,該Stream還提供了適合各自類(lèi)型的其他操作方法

Stream<String> stringStream = Stream.of("-2", "-1", "0", "1", "2", "3");
IntStream intStream = stringStream.mapToInt(Integer::parseInt);
LongStream longStream = stringStream.mapToLong(Long::parseLong);
DoubleStream doubleStream = stringStream.mapToDouble(Double::parseDouble);

flatMap

flatMap方法用于將流中的每個(gè)元素轉(zhuǎn)換成其他類(lèi)型元素的流,比如,當(dāng)前有一個(gè)訂單(Order)列表,每個(gè)訂單又包含多個(gè)商品(itemList),如果要得到所有訂單的所有商品匯總,就可以使用該方法,如下:

Stream<Item> allItemStream = orderList.stream().flatMap(order -> order.itemList.stream());

flatMapToInt flatMapToLong flatMapToDouble

這三個(gè)方法是對(duì)flatMap方法的封裝,返回的是官方為各個(gè)類(lèi)型單獨(dú)定義的Stream,使用方法同上

distinct

distinct方法用于對(duì)流中的元素去重,判斷元素是否重復(fù)使用的是equals方法

Stream<Integer> numStream = Stream.of(-2, -1, 0, 0, 1, 2, 2, 3);
//不重復(fù)的數(shù)字流,uniqueNumStream -> (-2, -1, 0, 1, 2, 3)
Stream<Integer> uniqueNumStream = numStream.distinct();

sorted

sorted有一個(gè)無(wú)參和一個(gè)有參的方法,用于對(duì)流中的元素進(jìn)行排序。無(wú)參方法要求流中的元素必須實(shí)現(xiàn)Comparable接口,不然會(huì)報(bào)java.lang.ClassCastException異常

Stream<Integer> unorderedStream = Stream.of(5, 6, 32, 7, 27, 4);
//按從小到大排序完成的流,orderedStream -> (4, 5, 6, 7, 27, 32)
Stream<Integer> orderedStream = unorderedStream.sorted();

有參方法sorted(Comparator<? super T> comparator)不需要元素實(shí)現(xiàn)Comparable接口,通過(guò)指定的元素比較器對(duì)流內(nèi)的元素進(jìn)行排序

Stream<String> unorderedStream = Stream.of("1234", "123", "12", "12345", "123456", "1");
//按字符串長(zhǎng)度從小到大排序完成的流,orderedStream -> ("1", "12", "123", "1234", "12345", "123456")
Stream<String> orderedStream = unorderedStream.sorted(Comparator.comparingInt(String::length));

peek

peek方法可以不調(diào)整元素順序和數(shù)量的情況下消費(fèi)每一個(gè)元素,然后產(chǎn)生新的流,按文檔上的說(shuō)明,主要是用于對(duì)流執(zhí)行的中間過(guò)程做debug的時(shí)候使用,因?yàn)镾tream使用的時(shí)候一般都是鏈?zhǔn)秸{(diào)用的,所以可能會(huì)執(zhí)行多次流操作,如果想看每個(gè)元素在多次流操作中間的流轉(zhuǎn)情況,就可以使用這個(gè)方法實(shí)現(xiàn)

Stream.of("one", "two", "three", "four")
 .filter(e -> e.length() > 3)
 .peek(e -> System.out.println("Filtered value: " + e))
 .map(String::toUpperCase)
 .peek(e -> System.out.println("Mapped value: " + e))
 .collect(Collectors.toList());
 
輸出:
Filtered value: three
Mapped value: THREE
Filtered value: four
Mapped value: FOUR

limit(long maxSize)

limit方法會(huì)對(duì)流進(jìn)行順序截取,從第1個(gè)元素開(kāi)始,保留最多maxSize個(gè)元素

Stream<String> stringStream = Stream.of("-2", "-1", "0", "1", "2", "3");
//截取前3個(gè)元素,subStringStream -> ("-2", "-1", "0")
Stream<String> subStringStream = stringStream.limit(3);

skip(long n)

skip方法用于跳過(guò)前n個(gè)元素,如果流中的元素?cái)?shù)量不足n,則返回一個(gè)空的流

Stream<String> stringStream = Stream.of("-2", "-1", "0", "1", "2", "3");
//跳過(guò)前3個(gè)元素,subStringStream -> ("1", "2", "3")
Stream<String> subStringStream = stringStream.skip(3);

forEach

forEach方法的作用跟普通的for循環(huán)類(lèi)似,不過(guò)這個(gè)可以支持多線程遍歷,但是不保證遍歷的順序

Stream<String> stringStream = Stream.of("-2", "-1", "0", "1", "2", "3");
//單線程遍歷輸出元素
stringStream.forEach(System.out::println);
//多線程遍歷輸出元素
stringStream.parallel().forEach(System.out::println);

forEachOrdered

forEachOrdered方法可以保證順序遍歷,比如這個(gè)流是從外部傳進(jìn)來(lái)的,然后在這之前調(diào)用過(guò)parallel方法開(kāi)啟了多線程執(zhí)行,就可以使用這個(gè)方法保證單線程順序遍歷

Stream<String> stringStream = Stream.of("-2", "-1", "0", "1", "2", "3");
//順序遍歷輸出元素
stringStream.forEachOrdered(System.out::println);
//多線程遍歷輸出元素,下面這行跟上面的執(zhí)行結(jié)果是一樣的
//stringStream.parallel().forEachOrdered(System.out::println);

toArray

toArray有一個(gè)無(wú)參和一個(gè)有參的方法,無(wú)參方法用于把流中的元素轉(zhuǎn)換成Object數(shù)組

Stream<String> stringStream = Stream.of("-2", "-1", "0", "1", "2", "3");
Object[] objArray = stringStream.toArray();

有參方法toArray(IntFunction<A[]> generator)支持把流中的元素轉(zhuǎn)換成指定類(lèi)型的元素?cái)?shù)組

Stream<String> stringStream = Stream.of("-2", "-1", "0", "1", "2", "3");
String[] strArray = stringStream.toArray(String[]::new);

reduce

reduce有三個(gè)重載方法,作用是對(duì)流內(nèi)元素做累進(jìn)操作

第一個(gè)reduce(BinaryOperator<T> accumulator)

accumulator 為累進(jìn)操作的具體計(jì)算

單線程等下如下代碼

boolean foundAny = false;
T result = null;
for (T element : this stream) {
 if (!foundAny) {
 foundAny = true;
 result = element;
 }
 else
 result = accumulator.apply(result, element);
}
return foundAny ? Optional.of(result) : Optional.empty();
Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//查找最小值
Optional<Integer> min = numStream.reduce(BinaryOperator.minBy(Integer::compareTo));
//輸出 -2
System.out.println(min.get());

//過(guò)濾出大于5的元素流
numStream = Stream.of(-2, -1, 0, 1, 2, 3).filter(num -> num > 5);
//查找最小值
min = numStream.reduce(BinaryOperator.minBy(Integer::compareTo));
//輸出 Optional.empty
System.out.println(min);

第二個(gè)reduce(T identity, BinaryOperator<T> accumulator)

identity 為累進(jìn)操作的初始值
accumulator 同上

單線程等價(jià)如下代碼

T result = identity;
for (T element : this stream)
 result = accumulator.apply(result, element)
return result;
Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//累加計(jì)算所有元素的和,sum=3
int sum = numStream.reduce(0, Integer::sum);

第三個(gè)reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner)

identity和accumulator同上

combiner用于多線程執(zhí)行的情況下合并最終結(jié)果

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
int sum = numStream.parallel().reduce(0, (a, b) -> {
 System.out.println("accumulator執(zhí)行:" + a + " + " + b);
 return a + b;
}, (a, b) -> {
 System.out.println("combiner執(zhí)行:" + a + " + " + b);
 return a + b;
});
System.out.println("最終結(jié)果:"+sum);

輸出:
accumulator執(zhí)行:0 + -1
accumulator執(zhí)行:0 + 1
accumulator執(zhí)行:0 + 0
accumulator執(zhí)行:0 + 2
accumulator執(zhí)行:0 + -2
accumulator執(zhí)行:0 + 3
combiner執(zhí)行:2 + 3
combiner執(zhí)行:-1 + 0
combiner執(zhí)行:1 + 5
combiner執(zhí)行:-2 + -1
combiner執(zhí)行:-3 + 6
最終結(jié)果:3

collect

collect有兩個(gè)重載方法,主要作用是把流中的元素作為集合轉(zhuǎn)換成其他Collection的子類(lèi),其內(nèi)部實(shí)現(xiàn)類(lèi)似于前面的累進(jìn)操作

第一個(gè)collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner)

supplier 需要返回開(kāi)始執(zhí)行時(shí)的默認(rèn)結(jié)果

accumulator 用于累進(jìn)計(jì)算用

combiner 用于多線程合并結(jié)果

單線程執(zhí)行等價(jià)于如下代碼

R result = supplier.get();
for (T element : this stream)
 accumulator.accept(result, element);
return result;

第二個(gè)collect(Collector<? super T, A, R> collector)

collector其實(shí)是對(duì)上面的方法參數(shù)的一個(gè)封裝,內(nèi)部執(zhí)行邏輯是一樣的,只不過(guò)JDK提供了一些默認(rèn)的Collector實(shí)現(xiàn)

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
List<Integer> numList = numStream.collect(Collectors.toList());
Set<Integer> numSet = numStream.collect(Collectors.toSet());

min

min方法用于計(jì)算流內(nèi)元素的最小值

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
Optional<Integer> min = numStream.min(Integer::compareTo);

max

min方法用于計(jì)算流內(nèi)元素的最大值

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
Optional<Integer> max = numStream.max(Integer::compareTo);

count

count方法用于統(tǒng)計(jì)流內(nèi)元素的總個(gè)數(shù)

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//count=6
long count = numStream.count();

anyMatch

anyMatch方法用于匹配校驗(yàn)流內(nèi)元素是否有符合指定條件的元素

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//判斷是否包含正數(shù),hasPositiveNum=true
boolean hasPositiveNum = numStream.anyMatch(num -> num > 0);

allMatch

allMatch方法用于匹配校驗(yàn)流內(nèi)元素是否所有元素都符合指定條件

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//判斷是否全部是正數(shù),allNumPositive=false
boolean allNumPositive = numStream.allMatch(num -> num > 0);

noneMatch

noneMatch方法用于匹配校驗(yàn)流內(nèi)元素是否都不符合指定條件

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//判斷是否沒(méi)有小于0的元素,noNegativeNum=false
boolean noNegativeNum = numStream.noneMatch(num -> num < 0);

findFirst

findFirst方法用于獲取第一個(gè)元素,如果流是空的,則返回Optional.empty

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
//獲取第一個(gè)元素,firstNum=-2
Optional<Integer> firstNum = numStream.findFirst();

findAny

findAny方法用于獲取流中的任意一個(gè)元素,如果流是空的,則返回Optional.empty,因?yàn)榭赡軙?huì)使用多線程,所以不保證每次返回的是同一個(gè)元素

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);
Optional<Integer> anyNum = numStream.findAny();

總結(jié)

到此這篇關(guān)于Java8新特性Stream的完全使用指南就介紹到這了,更多相關(guān)Java8 Stream使用指南內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java對(duì)接微信支付SDK接口簡(jiǎn)單圖文教程

    java對(duì)接微信支付SDK接口簡(jiǎn)單圖文教程

    在微信支付接口對(duì)接過(guò)程中,開(kāi)發(fā)者需準(zhǔn)備多項(xiàng)關(guān)鍵參數(shù),如開(kāi)發(fā)者ID(appid)、商戶(hù)號(hào)等,并完成相關(guān)注冊(cè)與認(rèn)證流程,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • 手把手教你搞懂冒泡排序和選擇排序

    手把手教你搞懂冒泡排序和選擇排序

    這篇文章主要介紹了java數(shù)組算法例題代碼詳解(冒泡排序,選擇排序),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Mybatis collection查詢(xún)集合屬性報(bào)錯(cuò)的解決方案

    Mybatis collection查詢(xún)集合屬性報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Mybatis collection查詢(xún)集合屬性報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java之Jackson使用案例詳解

    Java之Jackson使用案例詳解

    這篇文章主要介紹了Java之Jackson使用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 基于spring security實(shí)現(xiàn)登錄注銷(xiāo)功能過(guò)程解析

    基于spring security實(shí)現(xiàn)登錄注銷(xiāo)功能過(guò)程解析

    這篇文章主要介紹了基于spring security實(shí)現(xiàn)登錄注銷(xiāo)功能過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • JDK13.0.1安裝與環(huán)境變量的配置教程圖文詳解(Win10平臺(tái)為例)

    JDK13.0.1安裝與環(huán)境變量的配置教程圖文詳解(Win10平臺(tái)為例)

    這篇文章主要介紹了JDK13.0.1安裝與環(huán)境變量的配置教程圖文詳解(Win10平臺(tái)為例),本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • java實(shí)現(xiàn)抽獎(jiǎng)功能解析

    java實(shí)現(xiàn)抽獎(jiǎng)功能解析

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • springMVC配置環(huán)境實(shí)現(xiàn)文件上傳和下載

    springMVC配置環(huán)境實(shí)現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細(xì)介紹了springMVC配置環(huán)境實(shí)現(xiàn)文件上傳和下載的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 解決poi導(dǎo)出時(shí)單元格樣式被覆蓋問(wèn)題

    解決poi導(dǎo)出時(shí)單元格樣式被覆蓋問(wèn)題

    這篇文章主要介紹了解決poi導(dǎo)出時(shí)單元格樣式被覆蓋問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Mybatis逆向工程實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫(kù)

    Mybatis逆向工程實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫(kù)

    本文主要介紹了Mybatis逆向工程實(shí)現(xiàn)連接MySQL數(shù)據(jù)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06

最新評(píng)論

周口市| 雷山县| 武乡县| 涟源市| 宁都县| 临泽县| 五家渠市| 通山县| 潞西市| 收藏| 彝良县| 报价| 肃宁县| 盐山县| 中西区| 宜川县| 壤塘县| 西充县| 天门市| 清水河县| 景泰县| 西畴县| 杨浦区| 藁城市| 基隆市| 南川市| 南澳县| 巨鹿县| 佛山市| 新营市| 延津县| 开原市| 甘谷县| 宝丰县| 陇西县| 衡阳市| 新民市| 长沙市| 甘泉县| 乌拉特后旗| 临洮县|