在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ Headfirst 設計模式里面的 命令模式 中的有關數(shù)組賦值代碼

Headfirst 設計模式里面的 命令模式 中的有關數(shù)組賦值代碼

看不懂這段數(shù)組的賦值代碼。

public RemoteControl() {
    onCommands = new Command[7];
    offCommands = new Command[7];

    for (int i = 0; i < 7; i++) {
        onCommands[i] = () -> { };
        offCommands[i] = () -> { };
    }
}

這是啥意思?。?/p>

        onCommands[i] = () -> { };
        offCommands[i] = () -> { };

按這樣子運行,結果是對的;
但如果改成 等于null,就會報錯,顯然“() -> { }”并不代表賦空值。

回答
編輯回答
萌小萌

() -> {} 是一個 Java 8 的新特性:lambda 表達式。

命令模式在 Java 8 以前的實現(xiàn)是類似這樣的:

pulic interface Command {
    void doCommand();
}

這種單方法的接口,在 Java 8 里允許使用簡潔的 lambda 表達式來描述,如果這個方法有參數(shù),比如:

public interface Command {
    void doCommand(int arg1, int arg2);
}

那么,就可以用 (arg1, arg2) -> { System.out.println(arg1 + arg2); } 來描述一個接口的實現(xiàn)。

這是 函數(shù)式編程 的一種體現(xiàn),你可以多了解一下 Java 8 這方面的新特性。

所以回過頭來說,() -> {} 表示的是,實現(xiàn)了某個接口的空參、啥都不干的接口實例。
具體實現(xiàn)的是哪個接口取決于 onCommands 的類型聲明。

so,你這個例子里意思就是:
創(chuàng)建兩個數(shù)組,分別是開啟時要執(zhí)行的命令、關閉時要執(zhí)行的命令,數(shù)組長度為7;
為了初始化,避免空指針,為這兩個數(shù)組賦值 啥都不干接口實例 是最合適的。

2017年6月9日 09:35
編輯回答
絯孑氣

這里涉及到lambda表達式的問題。先參考一下這篇文章這篇文章,了解一下什么是lambda表達式。

在JAVA8以后推出了函數(shù)式編程,JAVA開始支持函數(shù)式參數(shù)傳遞。什么意思呢?就是函數(shù)也可以作為一個參數(shù)變量進行傳遞。下面舉一個真實的用例來解釋一下:

假設現(xiàn)在有一個String數(shù)組,我想找到里面名字叫做rale的童鞋:

int findRale(List<String> names){
    for(int i = 0 ; i<names.length ; i++){
        if(names.get(i).equals("rale") return i;
    }
    return -1;
}

也許我還想要找到里面所有首字母為R的同學,總之,很多類似的操作。

這時候有人想了,既然我需要對數(shù)組進行那么多類似的篩選操作,那么為什么我不寫一個通用的filter方法,然后傳入我想執(zhí)行的操縱呢?JAVA8表示,完全沒有問題。

//這里使用了JAVA8提供的Predicate接口,實現(xiàn)了函數(shù)式編程,也可以自定義函數(shù)式接口
//這一段代碼相當于將 (n) -> n.equalsTo("Rale") 方法賦值給sum
Predicate<String> sum = (n) -> n.equalsTo("Rale");
filter(names, sum);

//將數(shù)組以及想要傳遞給數(shù)組的操作作為參數(shù)丟入filter方法中
public static void filter(List names, Predicate condition) {
    for(String name: names)  {
        if(condition.test(name)) {
            System.out.println(name + " ");
        }
    }
}

當然了,在函數(shù)式編程推出后,JAVA也提出了更多更加精煉的寫法,這里就不一一贅述。

現(xiàn)在我們回到你題目中的這段代碼。Command就是一個函數(shù)式的接口,它可以被方法賦值。在這里onCommandsoffCommands都被初始化空函數(shù)() -> { }。如果后序有一個operate(Object o, Command c)方法,就可以直接傳入Command對象,從而直接在o上執(zhí)行相應的操作。

其實函數(shù)式編程和面向?qū)ο蟮木幊趟枷胧怯袥_突的。理解起來還要稍微轉變一下思路。

2017年4月30日 13:37