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

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


引用的 IntBinaryOperator 接口類型是為函數(shù)接受兩個整型參數(shù),并返回一個整型值:
IntBinaryOperator mult2 = (n1, n2) -> n1 * n2;mult2.applyAsInt(10, 20); // 200mult2.applyAsInt(10, 30); // 300引用 mult2 強調(diào)了需要兩個顯式參數(shù),在本例中是 10 和 20 。
前面介紹的 IntUnaryOperator 比 IntBinaryOperator 簡單,因為前者只需要一個參數(shù),而后者則需要兩個參數(shù) 。兩者均返回整數(shù)值 。因此,目標是將名為 mult2 的兩個參數(shù) IntBinraryOperator 柯里化成一個單一的 IntUnaryOperator 版本 curriedMult2 。
考慮 IntFunction<R> 類型 。此類型的函數(shù)采用整型參數(shù),并返回類型為 R 的結(jié)果,該結(jié)果可以是另一個函數(shù) —— 更準確地說,是 IntBinaryOperator 。讓一個 lambda 返回另一個 lambda 很簡單:
arg1 -> (arg2 -> arg1 * arg2) // 括號可以省略完整的 lambda 以 arg1 開頭,而該 lambda 的主體以及返回的值是另一個以 arg2 開頭的 lambda 。返回的 lambda 僅接受一個參數(shù)(arg2),但返回了兩個數(shù)字的乘積(arg1 和 arg2) 。下面的概述,再加上代碼,應該可以更好地進行說明 。
以下是如何柯里化 mult2 的概述:

  • 類型為 IntFunction<IntUnaryOperator> 的 lambda 被寫入并調(diào)用,其整型值為 10 。返回的 IntUnaryOperator 緩存了值 10,因此變成了已柯里化版本的 mult2,在本例中為 curriedMult2 。
  • 然后使用單個顯式參數(shù)(例如,20)調(diào)用 curriedMult2 函數(shù),該參數(shù)與緩存的參數(shù)(在本例中為 10)相乘以生成返回的乘積 。。
這是代碼的詳細信息:
// 創(chuàng)建一個接受一個參數(shù) n1 并返回一個單參數(shù) n2 -> n1 * n2 的函數(shù),該函數(shù)返回一個(n1 * n2 乘積的)整型數(shù) 。IntFunction<IntUnaryOperator> curriedMult2Maker = n1 -> (n2 -> n1 * n2);調(diào)用 curriedMult2Maker 生成所需的 IntUnaryOperator 函數(shù):
// 使用 curriedMult2Maker 獲取已柯里化版本的 mult2 。// 參數(shù) 10 是上面的 lambda 的 n1 。IntUnaryOperator curriedMult2 = curriedMult2Maker2.apply(10);值 10 現(xiàn)在緩存在 curriedMult2 函數(shù)中,以便 curriedMult2 調(diào)用中的顯式整型參數(shù)乘以 10:
curriedMult2.applyAsInt(20); // 200 = 10 * 20curriedMult2.applyAsInt(80); // 800 = 10 * 80緩存的值可以隨意更改:
curriedMult2 = curriedMult2Maker.apply(50); // 緩存 50curriedMult2.applyAsInt(101);               // 5050 = 101 * 50當然,可以通過這種方式創(chuàng)建多個已柯里化版本的 mult2,每個版本都有一個 IntUnaryOperator 。
柯里化充分利用了 lambda 的強大功能:可以很容易地編寫 lambda 表達式來返回需要的任何類型的值,包括另一個 lambda 。
總結(jié)Java 仍然是基于類的面向?qū)ο蟮木幊陶Z言 。但是,借助流 API 及其支持的函數(shù)式構(gòu)造,Java 向函數(shù)式語言(例如 Lisp)邁出了決定性的(同時也是受歡迎的)一步 。結(jié)果是 Java 更適合處理現(xiàn)代編程中常見的海量數(shù)據(jù)流 。在函數(shù)式方向上的這一步還使以在前面的代碼示例中突出顯示的管道的方式編寫清晰簡潔的 Java 代碼更加容易:
dataStream   .parallelStream() // 多線程以提高效率   .filter(...)      // 階段 1   .map(...)         // 階段 2   .filter(...)      // 階段 3   ...   .collect(...);    // 或者,也可以進行歸約:階段 N自動多線程,以 parallel 和 parallelStream 調(diào)用為例,建立在 Java 的 fork/join 框架上,該框架支持 任務竊取(task stealing) 以提高效率 。假設(shè) parallelStream 調(diào)用后面的線程池由八個線程組成,并且 dataStream 被八種方式分區(qū) 。某個線程(例如,T1)可能比另一個線程(例如,T7)工作更快,這意味著應該將 T7 的某些任務移到 T1 的工作隊列中 。這會在運行時自動發(fā)生 。

推薦閱讀