日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

javarandom函數(shù)用法 java隨機(jī)函數(shù)怎么寫( 三 )


當(dāng)前示例末尾的 sum 函數(shù)通過結(jié)合來自 parallelStream 線程的部分和,以線程安全的方式進(jìn)行歸約 。但是,程序員有責(zé)任確保在 parallelStream 調(diào)用引發(fā)的多線程過程中,程序員自己的函數(shù)調(diào)用(在本例中為 getValue)是線程安全的 。
最后一點(diǎn)值得強(qiáng)調(diào) 。lambda 語法鼓勵編寫 純函數(shù)(pure function),即函數(shù)的返回值僅取決于傳入的參數(shù)(如果有);純函數(shù)沒有副作用,例如更新一個類中的 static 字段 。因此,純函數(shù)是線程安全的,并且如果傳遞給高階函數(shù)的函數(shù)參數(shù)(例如 filter 和 map )是純函數(shù),則流 API 效果最佳 。
對于更細(xì)粒度的控制,有另一個流 API 函數(shù),名為 reduce,可用于對 Number 流中的值求和:
Integer sum4AllHarder = listOfNums    .parallelStream()                           // 多線程    .map(Number::getValue)                      // 每個 Number 的值    .reduce(0, (sofar, next) -> sofar + next);  // 求和此版本的 reduce 函數(shù)帶有兩個參數(shù),第二個參數(shù)是一個函數(shù):

  • 第一個參數(shù)(在這種情況下為零)是特征值,該值用作求和操作的初始值,并且在求和過程中流結(jié)束時用作默認(rèn)值 。
  • 第二個參數(shù)是累加器,在本例中,這個 lambda 表達(dá)式有兩個參數(shù):第一個參數(shù)(sofar)是正在運(yùn)行的和,第二個參數(shù)(next)是來自流的下一個值 。運(yùn)行的和以及下一個值相加,然后更新累加器 。請記住,由于開始時調(diào)用了 parallelStream,因此 map 和 reduce 函數(shù)現(xiàn)在都在多線程上下文中執(zhí)行 。
在到目前為止的示例中,流值被收集,然后被規(guī)約,但是,通常情況下,流 API 中的 Collectors 可以累積值,而不需要將它們規(guī)約到單個值 。正如下一個代碼段所示,收集活動可以生成任意豐富的數(shù)據(jù)結(jié)構(gòu) 。該示例使用與前面示例相同的 listOfNums:
Map<Number.Parity, List<Number>> numMap = listOfNums    .parallelStream()    .collect(Collectors.groupingBy(Number::getParity));List<Number> evens = numMap.get(Number.Parity.EVEN);List<Number> odds = numMap.get(Number.Parity.ODD);第一行中的 numMap 指的是一個 Map,它的鍵是一個 Number 奇偶校驗(yàn)位(ODD 或 EVEN),其值是一個具有指定奇偶校驗(yàn)位值的 Number 實(shí)例的 List 。同樣,通過 parallelStream 調(diào)用進(jìn)行多線程處理,然后 collect 調(diào)用(以線程安全的方式)將部分結(jié)果組裝到 numMap 引用的 Map 中 。然后,在 numMap 上調(diào)用 get 方法兩次,一次獲取 evens,第二次獲取 odds 。
實(shí)用函數(shù) dumpList 再次使用來自流 API 的高階 forEach 函數(shù):
private void dumpList(String msg, List<Number> list) {    System.out.println("\n" + msg);    list.stream().forEach(n -> n.dump()); // 或者使用 forEach(Number::dump)}這是示例運(yùn)行中程序輸出的一部分:
The sum of the randomly generated values is: 3322The sum again, using a different method:     3322Evens:Value: 72 (parity: even)Value: 54 (parity: even)...Value: 92 (parity: even)Odds:Value: 35 (parity: odd)Value: 37 (parity: odd)...Value: 41 (parity: odd)用于代碼簡化的函數(shù)式結(jié)構(gòu)函數(shù)式結(jié)構(gòu)(如方法引用和 lambda 表達(dá)式)非常適合在流 API 中使用 。這些構(gòu)造代表了 Java 中對高階函數(shù)的主要簡化 。即使在糟糕的過去,Java 也通過 Method 和 Constructor 類型在技術(shù)上支持高階函數(shù),這些類型的實(shí)例可以作為參數(shù)傳遞給其它函數(shù) 。由于其復(fù)雜性,這些類型在生產(chǎn)級 Java 中很少使用 。例如,調(diào)用 Method 需要對象引用(如果方法是非靜態(tài)的)或至少一個類標(biāo)識符(如果方法是靜態(tài)的) 。然后,被調(diào)用的 Method 的參數(shù)作為對象實(shí)例傳遞給它,如果沒有發(fā)生多態(tài)(那會出現(xiàn)另一種復(fù)雜性?。?,則可能需要顯式向下轉(zhuǎn)換 。相比之下,lambda 和方法引用很容易作為參數(shù)傳遞給其它函數(shù) 。

推薦閱讀