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

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

以下是一些函數(shù)組合的樣例:
int arg = 5;doubled.compose(squared).applyAsInt(arg); // 5 求 2 次方后乘 2:50tripled.compose(doubled).applyAsInt(arg); // 5 乘 2 后再乘 3:30doubled.andThen(squared).applyAsInt(arg); // 5 乘 2 后求 2 次方:100squared.andThen(tripled).applyAsInt(arg); // 5 求 2 次方后乘 3:75函數(shù)組合可以直接使用 lambda 表達(dá)式實(shí)現(xiàn),但是引用使代碼更簡(jiǎn)潔 。
構(gòu)造器引用構(gòu)造器引用是另一種函數(shù)式編程構(gòu)造,而這些引用在比 lambda 和方法引用更微妙的上下文中非常有用 。再一次重申,代碼示例似乎是最好的解釋方式 。
考慮這個(gè) POJO 類:
public class BedRocker { // 基巖的居民    private String name;    public BedRocker(String name) { this.name = name; }    public String getName() { return this.name; }    public void dump() { System.out.println(getName()); }}該類只有一個(gè)構(gòu)造函數(shù),它需要一個(gè) String 參數(shù) 。給定一個(gè)名字?jǐn)?shù)組,目標(biāo)是生成一個(gè) BedRocker 元素?cái)?shù)組,每個(gè)名字代表一個(gè)元素 。下面是使用了函數(shù)式結(jié)構(gòu)的代碼段:
String[] names = {"Fred", "Wilma", "Peebles", "Dino", "Baby Puss"};Stream<BedRocker> bedrockers = Arrays.asList(names).stream().map(BedRocker::new);BedRocker[] arrayBR = bedrockers.toArray(BedRocker[]::new);Arrays.asList(arrayBR).stream().forEach(BedRocker::dump);在較高的層次上,這個(gè)代碼段將名字轉(zhuǎn)換為 BedRocker 數(shù)組元素 。具體來說,代碼如下所示 。Stream 接口(在包 java.util.stream 中)可以被參數(shù)化,而在本例中,生成了一個(gè)名為 bedrockers 的 BedRocker 流 。
Arrays.asList 實(shí)用程序再次用于流化一個(gè)數(shù)組 names,然后將流的每一項(xiàng)傳遞給 map 函數(shù),該函數(shù)的參數(shù)現(xiàn)在是構(gòu)造器引用 BedRocker::new 。這個(gè)構(gòu)造器引用通過在每次調(diào)用時(shí)生成和初始化一個(gè) BedRocker 實(shí)例來充當(dāng)一個(gè)對(duì)象工廠 。在第二行執(zhí)行之后,名為 bedrockers 的流由五項(xiàng) BedRocker 組成 。
這個(gè)例子可以通過關(guān)注高階 map 函數(shù)來進(jìn)一步闡明 。在通常情況下,一個(gè)映射將一個(gè)類型的值(例如,一個(gè) int)轉(zhuǎn)換為另一個(gè)相同類型的值(例如,一個(gè)整數(shù)的后繼):
map(n -> n + 1) // 將 n 映射到其后繼然而,在 BedRocker 這個(gè)例子中,轉(zhuǎn)換更加戲劇化,因?yàn)橐粋€(gè)類型的值(代表一個(gè)名字的 String)被映射到一個(gè)不同類型的值,在這個(gè)例子中,就是一個(gè) BedRocker 實(shí)例,這個(gè)字符串就是它的名字 。轉(zhuǎn)換是通過一個(gè)構(gòu)造器調(diào)用來完成的,它是由構(gòu)造器引用來實(shí)現(xiàn)的:
map(BedRocker::new) // 將 String 映射到 BedRocker傳遞給構(gòu)造器的值是 names 數(shù)組中的其中一項(xiàng) 。
此代碼示例的第二行還演示了一個(gè)你目前已經(jīng)非常熟悉的轉(zhuǎn)換:先將數(shù)組先轉(zhuǎn)換成 List,然后再轉(zhuǎn)換成 Stream:
Stream<BedRocker> bedrockers = Arrays.asList(names).stream().map(BedRocker::new);第三行則是另一種方式 —— 流 bedrockers 通過使用數(shù)組構(gòu)造器引用 BedRocker[]::new 調(diào)用 toArray 方法:
BedRocker[ ] arrayBR = bedrockers.toArray(BedRocker[]::new);該構(gòu)造器引用不會(huì)創(chuàng)建單個(gè) BedRocker 實(shí)例,而是創(chuàng)建這些實(shí)例的整個(gè)數(shù)組:該構(gòu)造器引用現(xiàn)在為 BedRocker[]:new,而不是 BedRocker::new 。為了進(jìn)行確認(rèn),將 arrayBR 轉(zhuǎn)換為 List,再次對(duì)其進(jìn)行流式處理,以便可以使用 forEach 來打印 BedRocker 的名字 。
FredWilmaPeeblesDinoBaby Puss該示例對(duì)數(shù)據(jù)結(jié)構(gòu)的微妙轉(zhuǎn)換僅用幾行代碼即可完成,從而突出了可以將 lambda,方法引用或構(gòu)造器引用作為參數(shù)的各種高階函數(shù)的功能 。
柯里化(Currying)柯里化函數(shù)是指減少函數(shù)執(zhí)行任何工作所需的顯式參數(shù)的數(shù)量(通常減少到一個(gè)) 。(該術(shù)語是為了紀(jì)念邏輯學(xué)家 Haskell Curry 。)一般來說,函數(shù)的參數(shù)越少,調(diào)用起來就越容易,也更健壯 。(回想一下一些需要半打左右參數(shù)的噩夢(mèng)般的函數(shù)?。┮虼?,應(yīng)將柯里化視為簡(jiǎn)化函數(shù)調(diào)用的一種嘗試 。java.util.function 包中的接口類型適合于柯里化,如以下示例所示 。

推薦閱讀