日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JDK8 Stream 效率如何?

發(fā)布時間:2025/3/20 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JDK8 Stream 效率如何? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
點擊上方?好好學java?,選擇?星標?公眾號重磅資訊,干貨,第一時間送達今日推薦:推薦19個github超牛逼項目!個人原創(chuàng)100W +訪問量博客:點擊前往,查看更多

作者:Al_assad

鏈接:blog.csdn.net/Al_assad/article/details/82356606

Stream 是Java SE 8類庫中新增的關(guān)鍵抽象,它被定義于 java.util.stream (這個包里有若干流類型:Stream<T> 代表對象引用流,此外還有一系列特化流,如 IntStream,LongStream,DoubleStream等 )。

Java 8 引入的的Stream主要用于取代部分Collection的操作,每個流代表一個值序列,流提供一系列常用的聚集操作,可以便捷的在它上面進行各種運算。集合類庫也提供了便捷的方式使我們可以以操作流的方式使用集合、數(shù)組以及其它數(shù)據(jù)結(jié)構(gòu);

stream 的操作種類

① 中間操作?

當數(shù)據(jù)源中的數(shù)據(jù)上了流水線后,這個過程對數(shù)據(jù)進行的所有操作都稱為“中間操作”;
中間操作仍然會返回一個流對象,因此多個中間操作可以串連起來形成一個流水線;
stream 提供了多種類型的中間操作,如 filter、distinct、map、sorted 等等;

②終端操作?

當所有的中間操作完成后,若要將數(shù)據(jù)從流水線上拿下來,則需要執(zhí)行終端操作;

stream 對于終端操作,可以直接提供一個中間操作的結(jié)果,或者將結(jié)果轉(zhuǎn)換為特定的 collection、array、String 等;

這一部分詳細的說明可以參見:JDK8 Stream 詳細使用

stream 的特點

① 只能遍歷一次:

數(shù)據(jù)流的從一頭獲取數(shù)據(jù)源,在流水線上依次對元素進行操作,當元素通過流水線,便無法再對其進行操作,可以重新在數(shù)據(jù)源獲取一個新的數(shù)據(jù)流進行操作;

② 采用內(nèi)部迭代的方式:

對Collection進行處理,一般會使用?Iterator?遍歷器的遍歷方式,這是一種外部迭代;

而對于處理Stream,只要申明處理方式,處理過程由流對象自行完成,這是一種內(nèi)部迭代,對于大量數(shù)據(jù)的迭代處理中,內(nèi)部迭代比外部迭代要更加高效;

stream 相對于 Collection 的優(yōu)點

無存儲

流并不存儲值;

流的元素源自數(shù)據(jù)源(可能是某個數(shù)據(jù)結(jié)構(gòu)、生成函數(shù)或I/O通道等等),通過一系列計算步驟得到;

函數(shù)式風格

對流的操作會產(chǎn)生一個結(jié)果,但流的數(shù)據(jù)源不會被修改;

惰性求值

多數(shù)流操作(包括過濾、映射、排序以及去重)都可以以惰性方式實現(xiàn)。

這使得我們可以用一遍遍歷完成整個流水線操作,并可以用短路操作提供更高效的實現(xiàn);

無需上界

不少問題都可以被表達為無限流(infinite stream):

用戶不停地讀取流直到滿意的結(jié)果出現(xiàn)為止(比如說,枚舉 完美數(shù) 這個操作可以被表達為在所有整數(shù)上進行過濾);

集合是有限的,但流可以表達為無線流;

代碼簡練

對于一些collection的迭代處理操作,使用 stream 編寫可以十分簡潔,如果使用傳統(tǒng)的 collection 迭代操作,代碼可能十分啰嗦,可讀性也會比較糟糕;


stream 和 iterator 迭代的效率比較

好了,上面 stream 的優(yōu)點吹了那么多,stream 函數(shù)式的寫法是很舒服,那么 steam 的效率到底怎樣呢?

先說結(jié)論:

傳統(tǒng) iterator (for-loop) 比 stream(JDK8) 迭代性能要高,尤其在小數(shù)據(jù)量的情況下;

在多核情景下,對于大數(shù)據(jù)量的處理,parallel stream 可以有比 iterator 更高的迭代處理效率;

我分別對一個隨機數(shù)列 List (數(shù)量從 10 到 10000000)進行映射、過濾、排序、規(guī)約統(tǒng)計、字符串轉(zhuǎn)化場景下,對使用 stream 和 iterator 實現(xiàn)的運行效率進行了統(tǒng)計,測試代碼?基準測試代碼鏈接

測試環(huán)境如下:

System:Ubuntu 16.04?xenial CPU:Intel Core i7-8550U RAM:16GB JDK?version:1.8.0_151 JVM:HotSpot(TM)?64-Bit Server VM (build?25.151-b12, mixed?mode) JVM Settings:-Xms1024m-Xmx6144m-XX:MaxMetaspaceSize=512m-XX:ReservedCodeCacheSize=1024m-XX:+UseConcMarkSweepGC-XX:SoftRefLRUPolicyMSPerMB=100

1. 映射處理測試

把一個隨機數(shù)列(List<Integer>)中的每一個元素自增1后,重新組裝為一個新的 List<Integer>,測試的隨機數(shù)列容量從 10 - 10000000,跑10次取平均時間;

//stream List<Integer> result =?list.stream() .mapToInt(x -> x) .map(x -> ++x) .boxed() .collect(Collectors.toCollection(ArrayList::new)); //iterator List<Integer> result =?new?ArrayList<>(); for(Integer e :?list){result.add(++e); } //parallel stream List<Integer> result =?list.parallelStream() .mapToInt(x -> x) .map(x -> ++x) .boxed() .collect(Collectors.toCollection(ArrayList::new));

2. 過濾處理測試

取出一個隨機數(shù)列(List<Integer>)中的大于 200 的元素,并組裝為一個新的 List<Integer>,測試的隨機數(shù)列容量從 10 - 10000000,跑10次取平均時間;

//stream List<Integer> result =?list.stream() .mapToInt(x -> x) .filter(x -> x >?200) .boxed() .collect(Collectors.toCollection(ArrayList::new)); //iterator List<Integer> result =?new?ArrayList<>(list.size()); for(Integer e :?list){if(e >?200){result.add(e);} } //parallel stream List<Integer> result =?list.parallelStream() .mapToInt(x -> x) .filter(x -> x >?200) .boxed() .collect(Collectors.toCollection(ArrayList::new));

3. 自然排序測試

對一個隨機數(shù)列(List<Integer>)進行自然排序,并組裝為一個新的 List<Integer>,iterator 使用的是 Collections # sort API(使用歸并排序算法實現(xiàn)),測試的隨機數(shù)列容量從 10 - 10000000,跑10次取平均時間;

//stream List<Integer> result =?list.stream() .mapToInt(x->x) .sorted() .boxed() .collect(Collectors.toCollection(ArrayList::new)); //iterator List<Integer> result =?new?ArrayList<>(list); Collections.sort(result); //parallel stream List<Integer> result =?list.parallelStream() .mapToInt(x->x) .sorted() .boxed() .collect(Collectors.toCollection(ArrayList::new));

4. 歸約統(tǒng)計測試

獲取一個隨機數(shù)列(List<Integer>)的最大值,測試的隨機數(shù)列容量從 10 - 10000000,跑10次取平均時間;

//stream int?max =?list.stream() .mapToInt(x -> x) .max() .getAsInt(); //iterator int?max =?-1; for(Integer e :?list){if(e > max){max = e;} } //parallel stream int?max =?list.parallelStream() .mapToInt(x -> x) .max() .getAsInt();

5. 字符串拼接測試

獲取一個隨機數(shù)列(List<Integer>)各個元素使用“,”分隔的字符串,測試的隨機數(shù)列容量從 10 - 10000000,跑10次取平均時間;

//stream String result =?list.stream().map(String::valueOf).collect(Collectors.joining(",")); //iterator StringBuilder builder =?new?StringBuilder(); for(Integer e :?list){builder.append(e).append(","); } String result = builder.length() ==?0???""?: builder.substring(0,builder.length() -?1); //parallel stream String result =?list.stream().map(String::valueOf).collect(Collectors.joining(","));

6. 混合操作測試

對一個隨機數(shù)列(List<Integer>)進行去空值,除重,映射,過濾,并組裝為一個新的 List<Integer>,測試的隨機數(shù)列容量從 10 - 10000000,跑10次取平均時間;

//stream List<Integer> result =?list.stream() .filter(Objects::nonNull) .mapToInt(x -> x +?1) .filter(x -> x >?200) .distinct() .boxed() .collect(Collectors.toCollection(ArrayList::new)); //iterator HashSet<Integer> set =?new?HashSet<>(list.size()); for(Integer e :?list){if(e !=?null?&& e >?200){set.add(e +?1);} } List<Integer> result =?new?ArrayList<>(set); //parallel stream List<Integer> result =?list.parallelStream() .filter(Objects::nonNull) .mapToInt(x -> x +?1) .filter(x -> x >?200) .distinct() .boxed() .collect(Collectors.toCollection(ArrayList::new));

實驗結(jié)果總結(jié)

從以上的實驗來看,可以總結(jié)處以下幾點:

在少低數(shù)據(jù)量的處理場景中(size<=1000),stream 的處理效率是不如傳統(tǒng)的 iterator 外部迭代器處理速度快的,但是實際上這些處理任務本身運行時間都低于毫秒,這點效率的差距對普通業(yè)務幾乎沒有影響,反而 stream 可以使得代碼更加簡潔;

在大數(shù)據(jù)量(szie>10000)時,stream 的處理效率會高于 iterator,特別是使用了并行流,在cpu恰好將線程分配到多個核心的條件下(當然parallel stream 底層使用的是 JVM 的 ForkJoinPool,這東西分配線程本身就很玄學),可以達到一個很高的運行效率,然而實際普通業(yè)務一般不會有需要迭代高于10000次的計算;

Parallel Stream 受引 CPU 環(huán)境影響很大,當沒分配到多個cpu核心時,加上引用 forkJoinPool 的開銷,運行效率可能還不如普通的 Stream;

使用 Stream 的建議

簡單的迭代邏輯,可以直接使用 iterator,對于有多步處理的迭代邏輯,可以使用 stream,損失一點幾乎沒有的效率,換來代碼的高可讀性是值得的

單核 cpu 環(huán)境,不推薦使用 parallel stream,在多核 cpu 且有大數(shù)據(jù)量的條件下,推薦使用 paralle stream;

stream 中含有裝箱類型,在進行中間操作之前,最好轉(zhuǎn)成對應的數(shù)值流,減少由于頻繁的拆箱、裝箱造成的性能損失;

推薦文章
  • 2021 最新版 Spring Boot 速記教程

  • 2W 字你全面認識 Nginx

  • 47K Star 的SpringBoot+MyBatis+docker電商項目,附帶超詳細的文檔!

  • 寫博客能月入10K?

  • 一款基于 Spring Boot 的現(xiàn)代化社區(qū)(論壇/問答/社交網(wǎng)絡(luò)/博客)

更多項目源碼
  • 這或許是最美的Vue+Element開源后臺管理UI

  • 推薦一款高顏值的 Spring Boot 快速開發(fā)框架

  • 一款基于 Spring Boot 的現(xiàn)代化社區(qū)(論壇/問答/社交網(wǎng)絡(luò)/博客)

  • 13K點贊都基于 Vue+Spring 前后端分離管理系統(tǒng)ELAdmin,大愛

  • 想接私活時薪再翻一倍,建議根據(jù)這幾個開源的SpringBoot項目

總結(jié)

以上是生活随笔為你收集整理的JDK8 Stream 效率如何?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜影院91 | 91学生片黄 | 亚洲国产精品免费在线观看 | 精品视频免费 | 麻豆网站免费观看 | 国产无玛 | 久久视频精品 | 精品一区二区三区成人免费视频 | 午夜激情在线观看视频 | 九九热九九 | 日本三级吃奶头添泬 | 尤物av无码色av无码 | 亚洲男人皇宫 | 欧美在线亚洲 | 欧美成人精品激情在线视频 | 奇米99 | 国际av在线 | 国产精品免费视频观看 | 国产xxx在线 | 亚洲欧美日韩激情 | 正在播放一区 | 三级av片 | 国产精品福利网站 | 中文字幕被公侵犯的漂亮人妻 | 老局长的粗大高h | 8ppav| 男女爱爱网站 | 93看片淫黄大片一级 | 欧美精品免费看 | 日本肉体xxxx裸体137大胆图 | 欧美激情精品久久久久久变态 | 可以在线观看av的网站 | 亚洲一区二区三区视频在线 | 亚洲精品国产无码 | 色吧视频 | 一区=区三区乱码 | 欧美r级在线| 国产乱淫精品一区二区三区毛片 | 91久久精品国产91久久 | 精品伦精品一区二区三区视频密桃 | 七月色| 日本不卡一区二区三区在线观看 | 激情久久久久久 | 美女隐私黄www网站动漫 | 91激情在线观看 | 青青草手机在线观看 | 婷婷亚洲综合五月天小说 | 国产av电影一区二区 | 午夜不卡久久精品无码免费 | 影音先锋中文字幕在线播放 | 欧美日韩精品一区二区三区蜜桃 | 开心激情五月网 | 欧美伦理在线观看 | 久久bb | 99视频免费在线观看 | 人妻丰满熟妇av无码区hd | 男女啊啊啊 | 精品日韩一区 | 六月婷婷七月丁香 | 中文字幕88 | 欧美人与物videos另类 | 国产精品福利一区二区三区 | 一区二区不卡视频 | 韩日在线 | 在线观看中文字幕第一页 | 日日夜夜狠狠操 | 69福利网| 久久久久久影视 | 亚洲成网站 | 秋霞三区 | 男人肌肌桶女人肌肌 | 大肉大捧一进一出好爽视频 | www.插插插.com | china国模大尺度pics | 非洲黄色一级片 | 在线播放少妇奶水过盛 | 撒尿free性hd | 在线成人中文字幕 | 在线不卡视频 | 亚洲一区二区美女 | 善良的女邻居在线观看 | 成人免费看aa片 | 在线电影一区二区三区 | 国产草草影院 | 日本护士体内she精2xxx | 中文字幕免费在线观看视频 | 香蕉视频免费在线观看 | 少妇2做爰bd在线意大利堕落 | 青青草原综合网 | 日本一区二区色 | 日本一区免费 | 亚洲美女综合 | 视频免费1区二区三区 | 亚洲经典一区二区 | 精品人妻一区二区三区四区久久 | 亚洲国产精品国自产拍久久 | 欧美电影一区二区三区 | 91久久综合精品国产丝袜蜜芽 | av免播放器在线观看 |