Lambda 表達(dá)式主要應(yīng)用在一個(gè)方法需要帶一個(gè)接口類(lèi)型苍凛,而且接口只有一個(gè)抽象方法時(shí)慌申,在創(chuàng)建匿名內(nèi)部類(lèi)時(shí)一些固定的可推導(dǎo)不可變的代碼胶滋,使用一種比較簡(jiǎn)單的語(yǔ)法來(lái)表示璧疗,由編譯器自由推導(dǎo)出來(lái)
語(yǔ)法: 覆蓋方法的參數(shù)列表 -> 表達(dá)式(方法執(zhí)行體)
Lambda 的快速開(kāi)始和分析
在之前,我們做排序的操作如下
@Test
User[] users = { new User("A", 60), new User("A", 70), new User("A", 90) };
// 排序操作姨裸,這里第二參數(shù)是固定的秧倾,compare方法也是固定的,返回值 int 也是固定
Arrays.sort(users, new Comparator<User>() {
public int compare(User o1, User o2) {
return Integer.compare(o1.scope, o2.scope);
}
});
這里用到一個(gè)sort方法,而此方法中需要一個(gè)Comparator 接口類(lèi)型,但是這里new Comparator() 是固定的,需要覆蓋的接口方法compare 也是固定,返回值int也是固定,這些固定的東西實(shí)際上是可以推導(dǎo)出來(lái),所有可以使用lambda表達(dá)式來(lái)簡(jiǎn)化操作.
User[] users = { new User("A", 60), new User("A", 70), new User("A", 90) };
Arrays.sort(users, (User o1, User o2) -> {
return Integer.compare(o1.scope, o2.scope);
});
刪除固定的”new Comparator()” 和固定要覆蓋的抽象方法”compare”,保留 compare 的參數(shù)列表,中間加 ”->” 后面帶上方法體.至此 lambda 的簡(jiǎn)單使用就 ok 了
實(shí)際上因?yàn)槲覀兣判虻氖?users,而 users 存的就是 User 對(duì)象,所以參數(shù)的 User 類(lèi)型也是可以推導(dǎo)出來(lái)的,而當(dāng)方法體只有一行代碼時(shí)可以省略{},方法的返回值就是方法體也可以省略return.代碼如下
Arrays.sort(users, (o1, o2) -> Integer.compare(o1.scope, o2.scope));
再舉一線程的例子
//原來(lái)的操作
new Thread(new Runnable() {
public void run() {
System.out.println("hello lambda1");
}
}).start();
//優(yōu)化一
new Thread(() -> {
System.out.println("hello lambda1");
}
}).start();
//優(yōu)化二
new Thread(() -> System.out.println("hello lambda1");}).start();
Lambda 參數(shù)列表細(xì)節(jié)
Lambda表達(dá)式語(yǔ)法: 參數(shù)列表->表達(dá)式(方法體)
- 不帶參數(shù)
被覆蓋方法沒(méi)有參數(shù)使用 () 來(lái)表示參數(shù)列表,不可省略()
new Thread(() -> System.out.println("hello lambda")).start();
- 帶一個(gè)參數(shù)
- 1)如果參數(shù)寫(xiě)了類(lèi)型,那么參數(shù)外面必須加上()
- 2)如果參數(shù)不加類(lèi)型,可以省略()
Frame f = new Frame();
f.setSize(100, 100);
Button btn = new Button("lambda");
/* btn.addActionListener(
(ActionEvent event) -> System.out.println("嘻嘻哈哈")
); */
// 一個(gè)參數(shù)省略了類(lèi)型可以省略()
btn.addActionListener(event -> System.out.println("嘻嘻哈哈"));
f.add(btn);
f.setVisible(true);
- 帶多個(gè)參數(shù)
如果是兩個(gè)以上參數(shù)傀缩,不管有沒(méi)有加類(lèi)型那先,外面必須加上()
String[] names = {"xiaoli1","willie","xiaoming"};
Arrays.sort(names, (n1,n2) -> Integer.compare(n1.length(), n2.length()));
Lambda 表達(dá)式細(xì)節(jié)
Lambda 表達(dá)式表示的是被覆蓋的方法的執(zhí)行體,分以下兩種請(qǐng)求
- 方法體只有一行代碼,
如果方法體只有一行代碼,可以省略{},如果省略了{(lán)}.不管是否需要返回值都不能加return由編譯器自行推導(dǎo)出來(lái).
String[] names = {"willie","will","stef"};
Arrays.sort(names, (n1,n2) -> Integer.compare(n1.length(), n2.length()));
- 方法體有多行代碼,需加上{}按正常方法體書(shū)寫(xiě)
String[] names = {"willie","xiaoming","xiaohong"};
Arrays.sort(names, (n1,n2) -> {
int flag = Integer.compare(n1.length(), n2.length());
//如果需要返回值,代碼快中必須要有返回值
if(flag >= 0){
return 1;
}
return -1;
});