第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么在以可變對(duì)象為標(biāo)識(shí)的并行流中調(diào)用reduce方法不會(huì)保留結(jié)果中的順序?

為什么在以可變對(duì)象為標(biāo)識(shí)的并行流中調(diào)用reduce方法不會(huì)保留結(jié)果中的順序?

九州編程 2022-01-12 09:58:50
有以下看似“正確”的代碼:List<String> list = Arrays.asList("1","2","3","4","5","6",    "7","8","9","10","11","12");String result = list.parallelStream()   .reduce(new StringBuilder(), StringBuilder::append,        StringBuilder::append).toString();System.out.println(result);這段代碼的問(wèn)題是身份,new StringBuilder()在reduce方法調(diào)用是可變的,因此result被破壞,即的順序result不會(huì)保留。但是我無(wú)法完全理解原因,因此我無(wú)法想象以result與原始 不同的順序產(chǎn)生with的情況list。所以我畫(huà)了相應(yīng)的map-reduce圖,偶然得到了result保留順序:?jiǎn)栴}:首先,我想確認(rèn)這張圖是正確的。其次,如果這個(gè)圖是正確的,我想知道這個(gè)代碼片段的原因在哪里并不總是產(chǎn)生result保留順序
查看完整描述

1 回答

?
長(zhǎng)風(fēng)秋雁

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊

您的圖表不正確 - 您假設(shè)每個(gè)并行減少都以新的StringBuilder. 而不是每個(gè)并行縮減都從相同的標(biāo)識(shí)元素開(kāi)始- 使用相同的 StringBuilder(您創(chuàng)建并作為第一個(gè)參數(shù)傳遞給reduce方法的那個(gè))。


每個(gè)并行流都調(diào)用StringBuilder.append您傳遞給reduce方法的(一個(gè)也是唯一的)StringBuilder ,從而將當(dāng)前遇到的元素附加到它。


下一步是組合部分結(jié)果,同樣通過(guò)調(diào)用StringBuilder.append同一個(gè) StringBuilder,將 StringBuilder 內(nèi)容的副本附加到自身上。


要?jiǎng)?chuàng)建您繪制的圖表,您必須將 aSupplier<StringBuilder>作為第一個(gè)參數(shù)傳遞給 reduce 操作。


實(shí)際上,根據(jù) Holger 的評(píng)論,這在使用Mutable Reduction時(shí)是可能的。


為此,您無(wú)需調(diào)用 reduce 方法,而是調(diào)用該collect方法:


List<String> list = Arrays.asList("1","2","3","4","5","6",

    "7","8","9","10","11","12");

String result = list.parallelStream()

   .collect(StringBuilder::new, StringBuilder::append, 

       StringBuilder::append).toString();

System.out.println(result);


查看完整回答
反對(duì) 回復(fù) 2022-01-12
  • 1 回答
  • 0 關(guān)注
  • 178 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)