這里涉及到lambda表達(dá)式的問題。先參考一下這篇文章和這篇文章,了解一下什么是lambda表達(dá)式。在JAVA8以后推出了函數(shù)式編程,JAVA開始支持函數(shù)式參數(shù)傳遞。什么意思呢?就是函數(shù)也可以作為一個(gè)參數(shù)變量進(jìn)行傳遞。下面舉一個(gè)真實(shí)的用例來解釋一下:假設(shè)現(xiàn)在有一個(gè)String數(shù)組,我想找到里面名字叫做rale的童鞋:intfindRale(Listnames){for(inti=0;iif(names.get(i).equals("rale")returni;}return-1;}也許我還想要找到里面所有首字母為R的同學(xué),總之,很多類似的操作。這時(shí)候有人想了,既然我需要對數(shù)組進(jìn)行那么多類似的篩選操作,那么為什么我不寫一個(gè)通用的filter方法,然后傳入我想執(zhí)行的操縱呢?JAVA8表示,完全沒有問題。//這里使用了JAVA8提供的Predicate接口,實(shí)現(xiàn)了函數(shù)式編程,也可以自定義函數(shù)式接口//這一段代碼相當(dāng)于將(n)->n.equalsTo("Rale")方法賦值給sumPredicatesum=(n)->n.equalsTo("Rale");filter(names,sum);//將數(shù)組以及想要傳遞給數(shù)組的操作作為參數(shù)丟入filter方法中publicstaticvoidfilter(Listnames,Predicatecondition){for(Stringname:names){if(condition.test(name)){System.out.println(name+"");}}}當(dāng)然了,在函數(shù)式編程推出后,JAVA也提出了更多更加精煉的寫法,這里就不一一贅述。現(xiàn)在我們回到你題目中的這段代碼。Command就是一個(gè)函數(shù)式的接口,它可以被方法賦值。在這里onCommands和offCommands都被初始化空函數(shù)()->{}。如果后序有一個(gè)operate(Objecto,Commandc)方法,就可以直接傳入Command對象,從而直接在o上執(zhí)行相應(yīng)的操作。其實(shí)函數(shù)式編程和面向?qū)ο蟮木幊趟枷胧怯袥_突的。理解起來還要稍微轉(zhuǎn)變一下思路。