要搞清楚何為L(zhǎng)ambda表達(dá)式,首先要弄明白一個(gè)概念——函數(shù)式接口
函數(shù)式接口指的是只有一個(gè)抽象方法的接口复斥。
Lambda表達(dá)式的主要作用是:代替匿名內(nèi)部類的繁瑣語(yǔ)法:
- 不需要指出重寫的方法的名字
- 不需要給出重寫的方法的返回值類型
- 只需要給出重寫的方法括號(hào)以及括號(hào)里的形參列表
- 也就是說(shuō),Lambda表達(dá)式就相當(dāng)于一個(gè)匿名的方法
其組成分為三部分:
- 形參列表械媒。形參列表允許省略形參類型目锭。如果行參列表中只有一個(gè)參數(shù),也可以省略行參列表的圓括號(hào)纷捞。
- 箭頭符號(hào)(->)痢虹。該符號(hào)必須有英文中劃線和大于符號(hào)組成。
- 代碼塊主儡。代碼塊如果只包含一條語(yǔ)句奖唯,則允許省略掉花括號(hào)。Lambda表達(dá)式的代碼塊中只有一條return語(yǔ)句糜值,可以省略return關(guān)鍵字丰捷。Lambda表達(dá)式需要返回值,而其代碼塊中僅有一條省略了return的語(yǔ)句臀玄,表達(dá)式會(huì)自動(dòng)返回這條語(yǔ)句的值瓢阴。
看下面的例子:
interface CommandLine {
// 只有一個(gè)抽象方法,所以是函數(shù)式接口
public abstract void test(String str);
}
public class LambdaTest {
// 創(chuàng)建一個(gè)方法健无,此方法需要傳入
// 一個(gè)CommandLine接口的對(duì)象
public void f(CommandLine cl) {
System.out.println("f方法");
String s = "I am String";
// 注意這里荣恐,cl在后面的實(shí)現(xiàn)中雖然是匿名實(shí)現(xiàn)的
// 但仍然指的是對(duì)象,所以可以用cl來(lái)調(diào)用其test方法
cl.test(s);
}
// 新建方法比較匿名內(nèi)部類和Lambda表達(dá)式的區(qū)別
public void contrastAnonymousAndLambda() {
LambdaTest lt = new LambdaTest();
// 要實(shí)現(xiàn)f1方法累贤,需要傳入實(shí)現(xiàn)了CommandLine接口的對(duì)象
// 那么就要實(shí)現(xiàn)接口中的抽象方法
// 如果用匿名內(nèi)部類的方法實(shí)現(xiàn)叠穆,則有:
lt.f(new CommandLine() {
@Override
public void test(String str) {
System.out.println("字符串是:" + str);
}
});
// 再用Lambda表達(dá)式的方式來(lái)實(shí)現(xiàn)
lt.f(str ->
{
System.out.println("字符串是:" + str);
});
}
public static void main(String[] args) {
new LambdaTest().contrastAnonymousAndLambda();
}
}
輸出結(jié)果:
f方法
字符串是:I am String
f方法
字符串是:I am String
可見(jiàn),匿名類和Lambda表達(dá)式具有同樣的效果臼膏。但是Lambda表達(dá)式的代碼更為簡(jiǎn)潔硼被。
另注:
Lambda表達(dá)式的結(jié)果其實(shí)就被視作對(duì)象,所以程序中完全可以用Lambda表達(dá)式來(lái)進(jìn)行賦值:
interface I {
public abstract void test();
}
// I接口只包含一個(gè)無(wú)參數(shù)的抽象方法
// Lambda表達(dá)式代表的匿名方法實(shí)現(xiàn)了I接口中唯一且沒(méi)有參數(shù)的方法
// 因此Lambda表達(dá)式創(chuàng)建了一個(gè) I 對(duì)象
public class Demo {
// Lambda表達(dá)式相當(dāng)于一個(gè)匿名方法渗磅,
// 它重寫函數(shù)式接口中的抽象方法嚷硫,并返回一個(gè)接口對(duì)象
I inter = () -> {
System.out.println("Lambda表達(dá)式就相當(dāng)于一個(gè)匿名方法");
};
public static void main(String[] args) {
new Demo().inter.test();
}
}
輸出結(jié)果:
Lambda表達(dá)式就相當(dāng)于一個(gè)匿名方法
- Lambda表達(dá)式相當(dāng)于一個(gè)匿名方法
- 它重寫函數(shù)式接口中的抽象方法检访,并返回一個(gè)接口對(duì)象
諸君共勉:)