日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:43日期:2022-08-31 18:29:33

什么是Stream

Stream是Java 1.8版本開始提供的一個接口,主要提供對數據集合使用流的方式進行操作,流中的元素不可變且只會被消費一次,所有方法都設計成支持鏈式調用。使用Stream API可以極大生產力,寫出高效率、干凈、簡潔的代碼。

如何獲得Stream實例

Stream提供了靜態構建方法,可以基于不同的參數創建返回Stream實例

使用Collection的子類實例調用stream()或者parallelStream()方法也可以得到Stream實例,兩個方法的區別在于后續執行Stream其他方法的時候是單線程還是多線程

Stream<String> stringStream = Stream.of('1', '2', '3');//無限長的偶數流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方法用于根據指定的條件做過濾,返回符合條件的流

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

map

map方法用于將流中的每個元素執行指定的轉換邏輯,返回其他類型元素的流

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

mapToInt mapToLong mapToDouble

這三個方法是對map方法的封裝,返回的是官方為各個類型單獨定義的Stream,該Stream還提供了適合各自類型的其他操作方法

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方法用于將流中的每個元素轉換成其他類型元素的流,比如,當前有一個訂單(Order)列表,每個訂單又包含多個商品(itemList),如果要得到所有訂單的所有商品匯總,就可以使用該方法,如下:

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

flatMapToInt flatMapToLong flatMapToDouble

這三個方法是對flatMap方法的封裝,返回的是官方為各個類型單獨定義的Stream,使用方法同上

distinct

distinct方法用于對流中的元素去重,判斷元素是否重復使用的是equals方法

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

sorted

sorted有一個無參和一個有參的方法,用于對流中的元素進行排序。無參方法要求流中的元素必須實現Comparable接口,不然會報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)不需要元素實現Comparable接口,通過指定的元素比較器對流內的元素進行排序

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

peek

peek方法可以不調整元素順序和數量的情況下消費每一個元素,然后產生新的流,按文檔上的說明,主要是用于對流執行的中間過程做debug的時候使用,因為Stream使用的時候一般都是鏈式調用的,所以可能會執行多次流操作,如果想看每個元素在多次流操作中間的流轉情況,就可以使用這個方法實現

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: threeMapped value: THREEFiltered value: fourMapped value: FOUR

limit(long maxSize)

limit方法會對流進行順序截取,從第1個元素開始,保留最多maxSize個元素

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

skip(long n)

skip方法用于跳過前n個元素,如果流中的元素數量不足n,則返回一個空的流

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

forEach

forEach方法的作用跟普通的for循環類似,不過這個可以支持多線程遍歷,但是不保證遍歷的順序

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

forEachOrdered

forEachOrdered方法可以保證順序遍歷,比如這個流是從外部傳進來的,然后在這之前調用過parallel方法開啟了多線程執行,就可以使用這個方法保證單線程順序遍歷

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

toArray

toArray有一個無參和一個有參的方法,無參方法用于把流中的元素轉換成Object數組

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

有參方法toArray(IntFunction<A[]> generator)支持把流中的元素轉換成指定類型的元素數組

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

reduce

reduce有三個重載方法,作用是對流內元素做累進操作

第一個reduce(BinaryOperator<T> accumulator)

accumulator 為累進操作的具體計算

單線程等下如下代碼

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

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

identity 為累進操作的初始值accumulator 同上

單線程等價如下代碼

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);//累加計算所有元素的和,sum=3int sum = numStream.reduce(0, Integer::sum);

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

identity和accumulator同上

combiner用于多線程執行的情況下合并最終結果

Stream<Integer> numStream = Stream.of(-2, -1, 0, 1, 2, 3);int sum = numStream.parallel().reduce(0, (a, b) -> { System.out.println('accumulator執行:' + a + ' + ' + b); return a + b;}, (a, b) -> { System.out.println('combiner執行:' + a + ' + ' + b); return a + b;});System.out.println('最終結果:'+sum);輸出:accumulator執行:0 + -1accumulator執行:0 + 1accumulator執行:0 + 0accumulator執行:0 + 2accumulator執行:0 + -2accumulator執行:0 + 3combiner執行:2 + 3combiner執行:-1 + 0combiner執行:1 + 5combiner執行:-2 + -1combiner執行:-3 + 6最終結果:3

collect

collect有兩個重載方法,主要作用是把流中的元素作為集合轉換成其他Collection的子類,其內部實現類似于前面的累進操作

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

supplier 需要返回開始執行時的默認結果

accumulator 用于累進計算用

combiner 用于多線程合并結果

單線程執行等價于如下代碼

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

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

collector其實是對上面的方法參數的一個封裝,內部執行邏輯是一樣的,只不過JDK提供了一些默認的Collector實現

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方法用于計算流內元素的最小值

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

max

min方法用于計算流內元素的最大值

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

count

count方法用于統計流內元素的總個數

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

anyMatch

anyMatch方法用于匹配校驗流內元素是否有符合指定條件的元素

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

allMatch

allMatch方法用于匹配校驗流內元素是否所有元素都符合指定條件

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

noneMatch

noneMatch方法用于匹配校驗流內元素是否都不符合指定條件

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

findFirst

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

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

findAny

findAny方法用于獲取流中的任意一個元素,如果流是空的,則返回Optional.empty,因為可能會使用多線程,所以不保證每次返回的是同一個元素

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

總結

到此這篇關于Java8新特性Stream的完全使用指南就介紹到這了,更多相關Java8 Stream使用指南內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品伦理久久久久久| 婷婷综合国产| 国产欧美一区二区三区国产幕精品| 免费观看在线综合色| 中文字幕亚洲精品乱码| 欧美在线看片| 另类欧美日韩国产在线| 国产欧美一区二区三区精品酒店| 久久免费国产| 97se综合| 香蕉久久国产| 欧美精品影院| 精品丝袜在线| 欧美大黑bbbbbbbbb在线| 先锋亚洲精品| 欧美在线日韩| 伊人久久视频| 亚洲一区二区三区高清| 日本成人在线一区| 成人在线视频免费看| 在线视频观看日韩| 日本一区免费网站| 日韩国产专区| 丝袜美腿高跟呻吟高潮一区| 午夜久久影院| 国产精品中文字幕制服诱惑| 91综合视频| 久久av一区| 久久精品国产久精国产| 狠狠色综合网| 欧美激情91| 亚洲一区日韩| 国产精品精品国产一区二区| 亚洲一区亚洲| 国产一区二区三区四区大秀| 午夜电影亚洲| 国产日韩视频在线| 尹人成人综合网| 国产探花一区在线观看| 免费视频一区二区三区在线观看| 久久久久欧美精品| 国产精品一区免费在线| 欧美特黄一级大片| 欧美日韩xxxx| 999在线观看精品免费不卡网站| 国产欧美一区| 91成人网在线观看| 欧美精品导航| 亚洲专区视频| av亚洲一区二区三区| 国产乱子精品一区二区在线观看| 久久精品国语| 久久精品国产99国产| 亚洲精品麻豆| 成人日韩在线| 欧美黄页在线免费观看| 在线视频精品| 中文字幕高清在线播放| 国产一级成人av| 石原莉奈一区二区三区在线观看 | 成人va天堂| 国产亚洲精品美女久久| 国产午夜久久| 久久久久网站| 国产精品高颜值在线观看| 日本成人中文字幕| 久久亚洲欧美| 日韩理论视频| 精品欧美视频| 国产图片一区| 日韩欧美久久| 在线一区视频| 国产中文一区| 久久久精品五月天| 久久中文字幕一区二区| 国产精品欧美在线观看| 亚洲最新av| 视频一区二区国产| 国产精品美女久久久浪潮软件| 高清av不卡| 国产盗摄——sm在线视频| 国产精品美女在线观看直播| 蜜臀91精品一区二区三区| 亚洲一区观看| 国产免费成人| 免费观看日韩电影| 亚洲精品黄色| 亚洲毛片网站| 91精品在线免费视频| 免费不卡在线视频| 影音先锋久久精品| 亚洲精品动态| 亚洲精品九九| 欧美日韩精品一区二区三区在线观看| 在线精品亚洲| 中文字幕日韩高清在线| 亚洲精品三级| 国产农村妇女精品一二区| 国产亚洲在线观看| 亚洲激情社区| 免费黄网站欧美| 日韩激情av在线| 国产精品三p一区二区| 国产黄色精品| 国产高潮在线| 不卡视频在线| 石原莉奈在线亚洲三区| 日韩福利在线观看| 国产精品亚洲二区| 精品一区二区三区亚洲| 中文av在线全新| 狠狠色狠狠色综合日日tαg| 欧美在线影院| 亚洲va久久| 国产精品一区二区三区av麻| 国产精品视频一区二区三区四蜜臂| 久久99国产精品视频| 少妇久久久久| 亚洲资源网站| 精品国产精品国产偷麻豆| 国语精品一区| 精品一区在线| 中文无码日韩欧| 国产激情精品一区二区三区| 精品亚洲成人| 亚洲小说欧美另类婷婷| 免费精品视频| 亚洲精选成人| 国产videos久久| 亚洲欧洲一区| 日本成人在线一区| 久久av网站| 91久久国产| 国产精品黄色片| 婷婷久久一区| 日本天堂一区| 精品捆绑调教一区二区三区| 六月婷婷一区| 九九99久久精品在免费线bt| 成人羞羞视频在线看网址| 亚洲激情中文| 国产麻豆精品| 成人台湾亚洲精品一区二区| 国模精品一区| 成人av二区| 国产亚洲欧美日韩精品一区二区三区| 91亚洲成人| 日韩一区中文| 四虎影视精品| 日韩高清欧美激情| 三级精品视频| 日韩国产欧美视频| 色爱av综合网| 国产精品麻豆成人av电影艾秋| 国产在线欧美| 精品久久久久久久| 免费视频最近日韩| 精品视频一区二区三区在线观看 | 国精品产品一区| 久久成人国产| 亚洲黄色免费看| 欧美视频久久| 最新亚洲激情| 黄色精品视频| 日韩av中文字幕一区二区三区| 国产在视频一区二区三区吞精| 亚洲先锋成人| 日韩av在线播放网址| 日本视频一区二区| 不卡av一区二区| 国产aⅴ精品一区二区四区| 日本一区二区三区视频在线看| jiujiure精品视频播放| 福利一区视频| 国产精品高潮呻吟久久久久| 日本大胆欧美人术艺术动态| 亚洲不卡系列| 久久精品免费看| 欧美日韩亚洲一区二区三区在线| 视频一区在线播放| 婷婷成人基地| 久久a爱视频| 日韩av一区二区三区四区| 爽好久久久欧美精品| 欧美日韩三区| 激情综合网站| 美女久久久久| 久久香蕉国产| 久久九九国产| 国产乱码午夜在线视频| 久久97久久97精品免视看秋霞| 国产日韩一区二区三区在线| 亚洲性视频在线| 在线精品亚洲| 巨乳诱惑日韩免费av| 99国产精品99久久久久久粉嫩| av资源新版天堂在线| 国产精品精品| 亚洲欧洲高清| 欧洲在线一区|