看不懂這段數(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ù)組賦值 啥都不干 的 接口實例 是最合適的。
這里涉及到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ù)式的接口,它可以被方法賦值。在這里onCommands和offCommands都被初始化空函數(shù)() -> { }。如果后序有一個operate(Object o, Command c)方法,就可以直接傳入Command對象,從而直接在o上執(zhí)行相應的操作。
其實函數(shù)式編程和面向?qū)ο蟮木幊趟枷胧怯袥_突的。理解起來還要稍微轉變一下思路。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。