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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java8 Stream 数据流,大数据量下的性能效率怎么样?

發(fā)布時(shí)間:2025/3/20 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java8 Stream 数据流,大数据量下的性能效率怎么样? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今日推薦程序猿慣用口頭禪,你被擊中了嗎? 常見代碼重構(gòu)技巧(非常實(shí)用) B站,牛啊。

程序員缺乏經(jīng)驗(yàn)的 7 種表現(xiàn)

2021年4月程序員工資統(tǒng)計(jì):平均14596元,南京程序員收入擠進(jìn)一線。

來源:blog.csdn.net/Al_assad/article/details/82356606

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

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

stream 的操作種類

①中間操作

  • 當(dāng)數(shù)據(jù)源中的數(shù)據(jù)上了流水線后,這個(gè)過程對(duì)數(shù)據(jù)進(jìn)行的所有操作都稱為“中間操作”;

  • 中間操作仍然會(huì)返回一個(gè)流對(duì)象,因此多個(gè)中間操作可以串連起來形成一個(gè)流水線;

  • stream 提供了多種類型的中間操作,如 filter、distinct、map、sorted 等等;

②終端操作

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

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

stream 的特點(diǎn)

①只能遍歷一次:

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

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

對(duì)Collection進(jìn)行處理,一般會(huì)使用 Iterator 遍歷器的遍歷方式,這是一種外部迭代;

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

stream 相對(duì)于 Collection 的優(yōu)點(diǎn)

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

  • 函數(shù)式風(fēng)格: 對(duì)流的操作會(huì)產(chǎn)生一個(gè)結(jié)果,但流的數(shù)據(jù)源不會(huì)被修改;

  • 惰性求值: 多數(shù)流操作(包括過濾、映射、排序以及去重)都可以以惰性方式實(shí)現(xiàn)。這使得我們可以用一遍遍歷完成整個(gè)流水線操作,并可以用短路操作提供更高效的實(shí)現(xiàn);

  • 無需上界: 不少問題都可以被表達(dá)為無限流(infinite stream):用戶不停地讀取流直到滿意的結(jié)果出現(xiàn)為止(比如說,枚舉 完美數(shù) 這個(gè)操作可以被表達(dá)為在所有整數(shù)上進(jìn)行過濾);集合是有限的,但流可以表達(dá)為無線流;

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

stream 和 iterator 迭代的效率比較

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

先說結(jié)論:

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

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

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

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

System:Ubuntu 16.04 xenialCPU:Intel Core i7-8550URAM:16GBJDK version:1.8.0_151JVM: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. 映射處理測(cè)試

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

//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. 過濾處理測(cè)試

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

//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. 自然排序測(cè)試

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

//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)計(jì)測(cè)試

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

//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. 字符串拼接測(cè)試

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

??//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. 混合操作測(cè)試

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

//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));

實(shí)驗(yàn)結(jié)果總結(jié)

從以上的實(shí)驗(yàn)來看,可以總結(jié)處以下幾點(diǎn):

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

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

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

使用 Stream 的建議

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

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

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

推薦文章2021年4月程序員工資統(tǒng)計(jì):平均14596元,南京程序員收入擠進(jìn)一線。 常見的SQL面試題:經(jīng)典50例 47K Star 的SpringBoot+MyBatis+docker電商項(xiàng)目,附帶超詳細(xì)的文檔! 寫博客能月入10K? 一款基于 Spring Boot 的現(xiàn)代化社區(qū)(論壇/問答/社交網(wǎng)絡(luò)/博客) 更多項(xiàng)目源碼
  • 這或許是最美的Vue+Element開源后臺(tái)管理UI

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

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

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

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

總結(jié)

以上是生活随笔為你收集整理的Java8 Stream 数据流,大数据量下的性能效率怎么样?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 一品毛片 | 在线免费a视频 | 亚州av成人 | 国内精品国产三级国产aⅴ久 | 在线观看免费av网址 | 色噜噜噜| 91网站免费在线观看 | 天天在线观看 | 成人综合精品 | 女女同性女同一区二区三区按摩 | 美丽姑娘免费观看在线观看 | 国产美女精品视频 | 一区二区三区韩国 | 色哟哟网站在线观看 | 日韩中文在线视频 | 看国产毛片 | 午夜剧场欧美 | 亚洲精品中文字幕在线 | 狠狠插狠狠操 | 国产成人福利视频 | 黄色一及毛片 | 欧美午夜三级 | 日本精品一区二区三区在线观看 | 自拍偷拍亚洲区 | 性——交——性——乱免费的 | 91精品人妻一区二区三区 | 四虎福利视频 | 久久噜噜噜 | 黄色的网站在线观看 | 欧美日韩免费做爰视频 | 久久依人网 | 人妖videosex高潮另类 | 青娱乐国产在线视频 | 香蕉啪啪网 | 国产在线精品播放 | 黄色一级片免费看 | 97视频精品 | 国产大片中文字幕 | 一级裸体片| 国产午夜福利片 | 69免费| 蜜桃成熟时李丽珍国语 | 日韩黄色免费网站 | 在线观看波多野结衣 | 狠狠干夜夜干 | 黄色羞羞网站 | 国产无套粉嫩白浆内谢 | 人人九九 | 高h教授1v1h喂奶 | 国产精品无码一区二区三区在线看 | 九草在线| 精品久久久久久无码中文野结衣 | www.激情五月 | av鲁丝一区鲁丝二区鲁丝 | 亚洲男人天堂影院 | 亚洲国产欧美精品 | 国内精品久久99人妻无码 | 国产日本欧美在线 | 亚洲aaaaa特级 | 欧美另类一区二区 | 久久久久蜜桃 | 国产麻豆一精品一av一免费 | 亚洲美女在线观看 | 日韩女优一区 | 三级黄色片网站 | 亚洲日本久久 | 全部孕妇毛片丰满孕妇孕交 | 久久久欧美精品sm网站 | 久久久久久91香蕉国产 | 久久激情五月 | 亚洲图片视频在线 | 欧美456| 在线观看aaa | 福利影院在线 | 日韩午夜一区 | 爱爱综合网 | 91在线观看喷潮 | 亚洲精品国产精品乱码不卡√香蕉 | 色香蕉在线 | 欧美精品黄| 男人爽女人下面动态图 | 五月婷婷久久久 | 亚洲综合色一区 | 北条麻妃青青久久 | 男男做爰猛烈叫床爽爽小说 | 私人毛片 | 成人免费一区二区三区 | 国产精品久久久久一区二区 | 在线中文字幕第一页 | 中文字幕免费观看 | xxxx日本少妇 | 亚洲成人一二三 | 国产无遮挡又黄又爽又色视频 | 国产一区二区三区久久 | 尤物网站在线 | 久久网址 | 少妇精品无码一区二区免费视频 | 一区在线播放 | 久久躁日日躁aaaaxxxx |