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

javarandom函數(shù)用法 java隨機函數(shù)怎么寫( 二 )

IntStream 類型包括一個 range 函數(shù),該函數(shù)在指定的范圍內(nèi)生成一個整數(shù)值流,在本例中,以 1 為增量,從 1 遞增到 2048 。parallel 函數(shù)自動劃分該工作到多個線程中,在各個線程中進行過濾和打印 。(線程數(shù)通常與主機系統(tǒng)上的 CPU 數(shù)量匹配 。)函數(shù) forEach 參數(shù)是一個方法引用,在本例中是對封裝在 System.out 中的 println 方法的引用,方法輸出類型為 PrintStream 。方法和構(gòu)造器引用的語法將在稍后討論 。
由于具有多線程,因此整數(shù)值整體上以任意順序打印,但在給定線程中是按順序打印的 。例如,如果線程 T1 打印 409 和 411,那么 T1 將按照順序 409-411 打印,但是其它某個線程可能會預(yù)先打印 2045 。parallel 調(diào)用后面的線程是并發(fā)執(zhí)行的,因此它們的輸出順序是不確定的 。
map/reduce 模式map/reduce 模式在處理大型數(shù)據(jù)集方面變得很流行 。一個 map/reduce 宏操作由兩個微操作構(gòu)成 。首先,將數(shù)據(jù)分散( 映射(mapped))到各個工作程序中,然后將單獨的結(jié)果收集在一起 —— 也可能收集統(tǒng)計起來成為一個值,即 歸約(reduction) 。歸約可以采用不同的形式,如以下示例所示 。
下面 Number 類的實例用 EVEN 或 ODD 表示有奇偶校驗的整數(shù)值:
public class Number {    enum Parity { EVEN, ODD }    private int value;    public Number(int n) { setValue(n); }    public void setValue(int value) { this.value = https://www.jinnalai.com/fenxiang/value; } public int getValue() { return this.value; } public Parity getParity() { return ((value & 0x1) == 0) ? Parity.EVEN : Parity.ODD; } public void dump() { System.out.format("Value: %2d (parity: %s)\n", getValue(),                          (getParity() == Parity.ODD ? "odd" : "even"));    }}下面的代碼演示了用 Number 流進行 map/reduce 的情形,從而表明流 API 不僅可以處理 int 和 float 等基本類型,還可以處理程序員自定義的類類型 。
在下面的代碼段中,使用了 parallelStream 而不是 stream 函數(shù)對隨機整數(shù)值列表進行流化處理 。與前面介紹的 parallel 函數(shù)一樣,parallelStream 變體也可以自動執(zhí)行多線程 。
final int howMany = 200;Random r = new Random();Number[] nums = new Number[howMany];for (int i = 0; i < howMany; i++) nums[i] = new Number(r.nextInt(100));List<Number> listOfNums = Arrays.asList(nums);  // 將數(shù)組轉(zhuǎn)化為 listInteger sum4All = listOfNums    .parallelStream()           // 自動執(zhí)行多線程    .mapToInt(Number::getValue) // 使用方法引用,而不是 lambda    .sum();                     // 將流值計算出和值System.out.println("The sum of the randomly generated values is: " + sum4All);高階的 mapToInt 函數(shù)可以接受一個 lambda 作為參數(shù),但在本例中,它接受一個方法引用,即 Number::getValue 。getValue 方法不需要參數(shù),它返回給定的 Number 實例的 int 值 。語法并不復(fù)雜:類名 Number 后跟一個雙冒號和方法名 ?;叵胍幌孪惹暗睦?System.out::println,它在 System 類中的 static 屬性 out 后面有一個雙冒號 。
方法引用 Number::getValue 可以用下面的 lambda 表達式替換 。參數(shù) n 是流中的 Number 實例中的之一:
mapToInt(n -> n.getValue())通常,lambda 表達式和方法引用是可互換的:如果像 mapToInt 這樣的高階函數(shù)可以采用一種形式作為參數(shù),那么這個函數(shù)也可以采用另一種形式 。這兩個函數(shù)式編程結(jié)構(gòu)具有相同的目的 —— 對作為參數(shù)傳入的數(shù)據(jù)執(zhí)行一些自定義操作 。在兩者之間進行選擇通常是為了方便 。例如,lambda 可以在沒有封裝類的情況下編寫,而方法則不能 。我的習(xí)慣是使用 lambda,除非已經(jīng)有了適當(dāng)?shù)姆庋b方法 。

推薦閱讀