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

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


但是,新的函數(shù)式結(jié)構(gòu)在流 API 之外具有其它用途 ??紤]一個 Java GUI 程序,該程序帶有一個供用戶按下的按鈕,例如,按下以獲取當(dāng)前時間 。按鈕按下的事件處理程序可能編寫如下:
JButton updateCurrentTime = new JButton("Update current time");updateCurrentTime.addActionListener(new ActionListener() {    @Override    public void actionPerformed(ActionEvent e) {        currentTime.setText(new Date().toString());    }});這個簡短的代碼段很難解釋 。關(guān)注第二行,其中方法 addActionListener 的參數(shù)開始如下:
new ActionListener() {這似乎是錯誤的,因?yàn)?ActionListener 是一個抽象接口,而抽象類型不能通過調(diào)用 new 實(shí)例化 。但是,事實(shí)證明,還有其它一些實(shí)例被實(shí)例化了:一個實(shí)現(xiàn)此接口的未命名內(nèi)部類 。如果上面的代碼封裝在名為 OldJava 的類中,則該未命名的內(nèi)部類將被編譯為 OldJava$1.class 。actionPerformed 方法在這個未命名的內(nèi)部類中被重寫 。
現(xiàn)在考慮使用新的函數(shù)式結(jié)構(gòu)進(jìn)行這個令人耳目一新的更改:
updateCurrentTime.addActionListener(e -> currentTime.setText(new Date().toString()));lambda 表達(dá)式中的參數(shù) e 是一個 ActionEvent 實(shí)例,而 lambda 的主體是對按鈕上的 setText 的簡單調(diào)用 。
函數(shù)式接口和函數(shù)組合到目前為止,使用的 lambda 已經(jīng)寫好了 。但是,為了方便起見,我們可以像引用封裝方法一樣引用 lambda 表達(dá)式 。以下一系列簡短示例說明了這一點(diǎn) 。
考慮以下接口定義:
@FunctionalInterface // 可選,通常省略interface BinaryIntOp {    abstract int compute(int arg1, int arg2); // abstract 聲明可以被刪除}注釋 @FunctionalInterface 適用于聲明唯一抽象方法的任何接口;在本例中,這個抽象接口是 compute 。一些標(biāo)準(zhǔn)接口,(例如具有唯一聲明方法 run 的 Runnable 接口)同樣符合這個要求 。在此示例中,compute 是已聲明的方法 。該接口可用作引用聲明中的目標(biāo)類型:
BinaryIntOp div = (arg1, arg2) -> arg1 / arg2;div.compute(12, 3); // 4包 java.util.function 提供各種函數(shù)式接口 。以下是一些示例 。
下面的代碼段介紹了參數(shù)化的 Predicate 函數(shù)式接口 。在此示例中,帶有參數(shù) String 的 Predicate<String> 類型可以引用具有 String 參數(shù)的 lambda 表達(dá)式或諸如 isEmpty 之類的 String 方法 。通常情況下,Predicate 是一個返回布爾值的函數(shù) 。
Predicate<String> pred = String::isEmpty; // String 方法的 predicate 聲明String[] strings = {"one", "two", "", "three", "four"};Arrays.asList(strings)   .stream()   .filter(pred)                  // 過濾掉非空字符串   .forEach(System.out::println); // 只打印空字符串在字符串長度為零的情況下,isEmpty Predicate 判定結(jié)果為 true 。因此,只有空字符串才能進(jìn)入管道的 forEach 階段 。
下一段代碼將演示如何將簡單的 lambda 或方法引用組合成更豐富的 lambda 或方法引用 。考慮這一系列對 IntUnaryOperator 類型的引用的賦值,它接受一個整型參數(shù)并返回一個整型值:
IntUnaryOperator doubled = n -> n * 2;IntUnaryOperator tripled = n -> n * 3;IntUnaryOperator squared = n -> n * n;IntUnaryOperator 是一個 FunctionalInterface,其唯一聲明的方法為 applyAsInt ?,F(xiàn)在可以單獨(dú)使用或以各種組合形式使用這三個引用 doubled、tripled 和 squared:
int arg = 5;doubled.applyAsInt(arg); // 10tripled.applyAsInt(arg); // 15squared.applyAsInt(arg); // 25

推薦閱讀