欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么需要Streams?它們能取代Java中的for循環(huán)嗎?

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-11-03 09:39 ? 次閱讀

1 代碼比較

具有類型的項目名稱列表

生成隨機列表

2 性能比較

迭代元素

并行流優(yōu)化

3 局限性

條件循環(huán)

重復(fù)

4 概括

Java8的發(fā)布是Java歷史上的一個重大時刻。Streams 和 Lambda 被引入,它們現(xiàn)在被廣泛使用。如果你不知道 Streams,或者從來沒有聽說過它,那是完全沒有問題的。在大多數(shù)情況下,循環(huán)同樣可以滿足我們的需要,沒有 Streams 也不會遇到任何問題。

那我們?yōu)槭裁葱枰猄treams?它們能取代循環(huán)嗎?或者比循環(huán)更有優(yōu)勢?在本文中,我們將研究代碼,比較性能,并看看Streams作為循環(huán)的替代品有多好。

1 代碼比較

Streams 增加了代碼復(fù)雜性,因為它們需要類、接口和導(dǎo)入新的包;相比之下,循環(huán)天生就是內(nèi)置的,不需要額外的引入任何東西。這在某些點上是對的,但也不盡然:代碼復(fù)雜度并不能僅僅看引入幾個類、幾個包文件來衡量,更重要的是代碼的可讀性。讓我們看一些例子。

具有類型的項目名稱列表

假設(shè)我們有一個項目列表,并且想要特定項目類型的名稱列表。使用循環(huán),我們需要編寫以下內(nèi)容:

ListgetItemNamesOfType(Listitems,Item.Typetype){
ListitemNames=newArrayList<>();
for(Itemitem:items){
if(item.type()==type){
itemNames.add(item.name());
}
}
returnitemNames;
}

閱讀代碼,我們會發(fā)現(xiàn) ArrayList 應(yīng)該實例化一個 new ,并且add()應(yīng)該在每個循環(huán)中進行類型檢查和調(diào)用。再來看,Streams 版本是如何處理的:

ListgetItemNamesOfTypeStream(Listitems,Item.Typetype){
returnitems.stream()
.filter(item->item.type()==type)
.map(item->item.name())
.toList();
}

在 Lambda 的幫助下,可以立即發(fā)現(xiàn)我們首先選擇具有給定類型的項目,然后獲取過濾項目的名稱列表。在這種代碼中,逐行流程與邏輯流程非常一致。

生成隨機列表

讓我們看另一個例子,在時間比較部分,我們將回顧關(guān)鍵的 Streams 方法并將它們的執(zhí)行時間與循環(huán)進行比較。為此,我們需要一個隨機的Items 列表。這是一個帶有靜態(tài)方法的片段,它給出了 隨機 Item:

publicrecordItem(Typetype,Stringname){
publicenumType{
WEAPON,ARMOR,HELMET,GLOVES,BOOTS,
}

privatestaticfinalRandomrandom=newRandom();
privatestaticfinalString[]NAMES={
"beginner",
"knight",
"king",
"dragon",
};

publicstaticItemrandom(){
returnnewItem(
Type.values()[random.nextInt(Type.values().length)],
NAMES[random.nextInt(NAMES.length)]);
}
}

現(xiàn)在,讓我們Item使用循環(huán)創(chuàng)建一個隨機列表。代碼如下所示:

Listitems=newArrayList<>(100);
for(inti=0;i

Streams 的代碼如下所示:

Listitems=Stream.generate(Item::random).limit(length).toList();

這是一段精彩且易于閱讀的代碼。此外,List返回的toList()方法中值是不可修改的,為我們提供了不變性,因此我們可以在代碼中的任何位置共享它,而不必?fù)?dān)心副作用。這使得代碼不易出錯,并且讀者更容易理解我們的代碼。

Streams 提供了多種有用的方法,讓我們可以編寫簡潔的代碼。最流行的是:

allMatch()

anyMatch()

count()

filter()

findFirst()

forEach()

map()

reduce()

sorted()

limit()

2 性能比較

在正常情況下,Streams 的行為類似于循環(huán),對執(zhí)行時間影響很小或沒有影響。讓我們將 Streams 中的一些主要行為與循環(huán)實現(xiàn)進行比較。

迭代元素

當(dāng)我們有一個元素集合時,在很多情況下都會迭代集合中的所有元素。在 Streams 中,諸如forEach()、map()、reduce()和 filter()類的方法可以執(zhí)行這種全元素迭代。

讓我們考慮一種情況,我們想要對列表中的每種類型的項目進行計數(shù)。

帶 for 循環(huán)的代碼如下所示:

publicMaploop(Listitems){
Mapmap=newHashMap<>();
for(Itemitem:items){
map.compute(item.type(),(key,value)->{
if(value==null)return1;
returnvalue+1;
});
}
returnmap;
}

Streams 的代碼如下所示:

publicMapstream(Listitems){
returnitems.stream().collect(Collectors.toMap(
Item::type,
value->1,
Integer::sum));
}

它們看起來截然不同,但它們的表現(xiàn)如何呢?下表是 100 次嘗試的平均執(zhí)行時間:

wKgZomVET7CAZUCWAAANg4Mn1PQ433.jpg

正如我們在上面的比較表中看到的,Streams 和循環(huán)在迭代整個列表時顯示出很小的執(zhí)行時間差異。在大多數(shù)情況下,這對于其他 Stream 方法(如map()、forEach()、reduce()等)是相同的。

并行流優(yōu)化

因此,我們發(fā)現(xiàn)在迭代列表時,流的性能并不比循環(huán)更好或更差。然而,Streams 有一個循環(huán)所不具備的神奇之處:我們可以輕松地利用流進行多線程計算。 所要做的就是使用parallelStream()而不是stream()。

為了了解我們可以從中獲得多少影響,讓我們看一下下面的示例,其中我們模擬了耗時較長的任務(wù),如下所示:

privatevoidlongTask(){
//Mocklongtask.
try{
Thread.sleep(1);
}catch(InterruptedExceptione){
thrownewRuntimeException(e);
}
}

循環(huán)遍歷列表將如下所示:

protectedvoidloop(Listitems){
for(Itemitem:items){
longTask();
}
}

Stream將如下所示:

protectedvoidstream(Listitems){
items.stream().forEach(item->longTask());
}

最后,并行流將如下所示:

protectedvoidparallel(Listitems){
items.parallelStream().forEach(item->longTask());
}

請注意, onlystream()已更改為parallelStream()。

這是比較:

wKgaomVET8CAcP3fAAAz0_C8Mhk030.jpg

正如預(yù)期的那樣,循環(huán)和Stream幾乎沒有什么區(qū)別。那么并行流呢?聳人聽聞!與其他實現(xiàn)相比,它節(jié)省了 80% 以上的執(zhí)行時間!這怎么可能?

對于需要很長時間才能完成并且應(yīng)該為列表中的每個元素獨立完成的任務(wù),它們可以同時運行,我們可以期待顯著的改進。這就是并行流正在做的事情。他們將它們分配到多個線程中并使它們同時運行。

并行流并非萬能通用,只有當(dāng)任務(wù)是獨立的時,它才有用。如果任務(wù)不是獨立的,并且必須共享相同的資源,則必須使用鎖(主要是Java中的synchronized關(guān)鍵字)來保證它們的安全,此時它們的運行速度慢于正常的迭代。

3 局限性

然而,Stream也有局限性。一種情況是條件循環(huán),另一種情況是重復(fù)。讓我們看看它們的意思。

條件循環(huán)

當(dāng)我們想要重復(fù)直到條件為真但不確定需要多少次迭代時,我們通常使用while循環(huán)。

booleancondition=true;
while(condition){
...
condition=doSomething();
}

使用 Streams 表現(xiàn)相同的代碼如下所示:

Stream.iterate(true,condition->condition,condition->doSomething())
.forEach(unused->...);

我們可以看到 Streams 代碼部分會干擾讀取,例如condition -> condition檢查條件是否為真,unused以及forEach()??紤]到這一點,條件循環(huán)最好寫在while循環(huán)中。

重復(fù)

重復(fù)是for循環(huán)存在的主要原因之一。假設(shè)我們想重復(fù)這個過程十次。有了for循環(huán),就可以很容易地寫成:

for(inti=0;i

在 Streams 中,實現(xiàn)此目的的一種方法是創(chuàng)建IntStream包含[0, 1, 2, ... , 9]并迭代它的 。

IntStream.range(0,10).forEach(i->...);

雖然代碼可能看起來簡潔而正確,但它看起來更側(cè)重于0到10(排除)范圍內(nèi)的值,其中for循環(huán)代碼可以重復(fù)讀取十次,因為更常見的做法是這樣寫repeat:從0開始,以重復(fù)次數(shù)結(jié)束。

4 概括

我們已經(jīng)對流和循環(huán)進行了一些比較。那么……Streams 可以取代循環(huán)嗎?嗯,一如既往,這取決于情況!然而,Streams 通??梢詾槲覀兲峁└啙崱⒁子陂喿x的代碼和優(yōu)化。


來源:betterprogramming.pub/can-streams-replace-loops-in-java-f56d4461743a






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2976

    瀏覽量

    105214
  • for循環(huán)
    +關(guān)注

    關(guān)注

    0

    文章

    61

    瀏覽量

    2548

原文標(biāo)題:Java 中的 Stream 可以替代 for 循環(huán)嗎?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Java入門需要學(xué)習(xí)什么?

    、怎樣多線程需要理解機理?很多Java程序員熱衷于多線程程序編寫,認(rèn)為是對邏輯能力的挑戰(zhàn)。其實在大量應(yīng)用根本就不需要編寫多線程程序,或者說大多數(shù)編寫應(yīng)用程序的程序員不會去寫多線程程序
    發(fā)表于 03-01 15:45

    怎么看待CKS32單片機能取代ST32單片機問題

    怎么看待中科芯CKS32單片機,能取代ST32單片機嗎?你會選擇CKS32的單片機嗎?謝謝!
    發(fā)表于 08-22 15:03

    為什么CAN能取代RS485?

    分享到 近年來 CAN 總線逐漸被工程師認(rèn)知,并以其突出特點,逐漸在取代RS485等總線,本文將以CAN與RS485為例總結(jié)各自優(yōu)勢,為您解疑“為什么CAN能取代RS485”。 現(xiàn)場總線是90年代初
    發(fā)表于 01-22 20:44 ?1390次閱讀
    為什么CAN<b class='flag-5'>能取代</b>RS485?

    Java Map的幾種循環(huán)方式學(xué)習(xí)總結(jié)

    本文檔內(nèi)容介紹了基于Java Map的幾種循環(huán)方式學(xué)習(xí)總結(jié),供參考
    發(fā)表于 03-19 15:51 ?0次下載

    對講機和微信的區(qū)別在哪里?為什么微信,手機不能取代對講機?

    對講機和微信的區(qū)別在哪里?為什么微信,手機不能取代對講機?
    的頭像 發(fā)表于 07-19 16:04 ?1w次閱讀

    AI不能取代醫(yī)生的原因分析

    在相當(dāng)長的時間內(nèi),人工智能只能服務(wù)醫(yī)生,輔助醫(yī)生,不可能取代醫(yī)生,因為部分疾病需要根據(jù)病史和患者各個方面的具體情況來判斷,這是AI做不到的。
    的頭像 發(fā)表于 08-28 18:28 ?7755次閱讀

    人工智能取代職業(yè)排行

    本視頻主要詳細(xì)介紹了人工智能取代職業(yè)排行,分別是電話推銷員、打字員、會計、保險業(yè)務(wù)員、銀行職員、政府職員、接線員、前臺等。
    的頭像 發(fā)表于 12-24 16:58 ?2.8w次閱讀

    Java教程之如何進行Java的do-while循環(huán)

    我們知道當(dāng)一開始循環(huán)條件就不滿足的時候,while循環(huán)一次也不會 執(zhí)行。有的時候。我們有這樣的需要:無論如何循環(huán)都先執(zhí)行一次,再判斷循環(huán)條件
    發(fā)表于 01-23 11:05 ?7次下載
    <b class='flag-5'>Java</b>教程之如何進行<b class='flag-5'>Java</b><b class='flag-5'>中</b>的do-while<b class='flag-5'>循環(huán)</b>

    Java循環(huán)語句的詳細(xì)資料說明

    本文檔的主要內(nèi)容詳細(xì)介紹的是Java循環(huán)語句的詳細(xì)資料說明包括了:1、while循環(huán)語句,2、do…while循環(huán)語句,3、for循環(huán)語句
    發(fā)表于 03-22 08:00 ?0次下載
    <b class='flag-5'>Java</b>的<b class='flag-5'>循環(huán)</b>語句的詳細(xì)資料說明

    人工智能取代醫(yī)生?

    人工智能取代醫(yī)生?AI畫出鼻咽癌放療靶區(qū),準(zhǔn)確性與醫(yī)生相當(dāng),由于鼻咽解剖位置特殊,手術(shù)治療困難,且鼻咽癌對射線敏感,因此放射治療是鼻咽癌的根治手段。中山大學(xué)腫瘤防治中心每年收治的5000余例鼻咽癌患者,經(jīng)過精準(zhǔn)放射治療聯(lián)合適當(dāng)強度的化療,80%以上的無遠(yuǎn)處轉(zhuǎn)移鼻咽癌可徹底治愈。
    發(fā)表于 07-04 16:21 ?634次閱讀

    設(shè)計應(yīng)用循環(huán)網(wǎng)絡(luò)布局

    大多數(shù)的設(shè)計不需要循環(huán)。然而,一些設(shè)計應(yīng)用程序(屏蔽信號,功率/地面網(wǎng)與部分通過)可能需要它們。在最新的墊專業(yè)VX.2.5更新,用戶可以允許和不允許
    的頭像 發(fā)表于 11-06 07:10 ?2367次閱讀

    機器人目前能取代人類記者和編輯嗎?

    外媒稱,有關(guān)微軟公司本月開始用人工智能取代自家新聞網(wǎng)站部分編輯人員的新聞,一度成為網(wǎng)絡(luò)上的關(guān)注熱點。但專家認(rèn)為,人工智能技術(shù)目前尚未發(fā)展到能夠取代人類記者的水平。
    的頭像 發(fā)表于 06-30 14:14 ?2472次閱讀

    詳解Python的while循環(huán)

    說起編程語言中的循環(huán),一般 for 循環(huán)用的時候比較多,因為相比于 while 循環(huán),for 循環(huán)的代碼量更少。不過有時候也會用到 while 循環(huán)
    的頭像 發(fā)表于 04-26 17:55 ?1473次閱讀

    集成壓控振蕩器的寬帶鎖相環(huán)能取代分立式解決方案嗎

    電子發(fā)燒友網(wǎng)站提供《集成壓控振蕩器的寬帶鎖相環(huán)能取代分立式解決方案嗎.pdf》資料免費下載
    發(fā)表于 11-22 16:15 ?0次下載
    集成壓控振蕩器的寬帶鎖相環(huán)<b class='flag-5'>能取代</b>分立式解決方案嗎

    javacpu占用過高如何分析

    JavaCPU占用過高是一種常見的問題,需要通過多種方法進行分析和解決。本文將詳細(xì)介紹JavaCPU占用過高的原因以及如何進行分析和優(yōu)化
    的頭像 發(fā)表于 12-05 11:15 ?9443次閱讀