Java基礎-Lambda表示式
阿新 • • 發佈:2020-12-31
Lambda表示式
Lambda表示式概述
Lambda 表示式,也可稱為閉包,它是推動 Java 8 釋出的最重要新特性。
Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞進方法中)。
使用 Lambda 表示式可以使程式碼變的更加簡潔緊湊。
lamda表示式又稱為函數語言程式設計。
如y=kx+1;f(x)=kx+1;這是數學中的函式,給定一個x,就能得到一個y的值
Lambda表示式又是面向介面的,面向介面程式設計。要想面向函式程式設計,按照面向介面的原則,就要定義一種函式式介面
Lambda表示式語法
使用匿名內部類實現一個介面
(parameters) -> expression
或
(parameters) ->{ statements; }
Lambda表示式案例
interface Fooi{
public void sayHello();
}
public class LambdaTest {
public static void main(String[] args) {
//介面不能new,使用匿名內部類
Fooi foo = new Fooi(){
@Override
public void sayHello() {
// TODO Auto-generated method stub
System.out.println("hello 2004");
}
};
foo.sayHello();
}
}
這裡程式本來只有一行,但是寫了這麼多。降低了程式開發的效率。
如何能夠優化呢?
Lambda表示式就是解決了匿名內部類程式碼冗餘的現象
我們可以看到,這個介面只有一個方法,當我們想要實現這個介面時,實現的方法也只有1個。即不用指定就知道是哪一個方法了。
Lambda表示式口訣:拷貝小括號,寫死右箭頭,落地大括號
interface Fooi{
public void sayHello();
}
public class LambdaTest {
public static void main(String[] args) {
Fooi foo=() -> {System.out.println("hello 1205");};
foo.sayHello();
}
}
後面程式碼只有兩行。明顯的提高了開發的效率
如果現在有多個方法呢,還能使用嗎?
interface Fooi{
public void sayHello();
public int add(int x,int y);
}
public class LambdaTest {
public static void main(String[] args) {
Fooi foo=()->{System.out.println("hello 1205");};
foo.sayHello();
}
}
此時程式報錯:
可見,函式式介面中只能實現一個方法才能使用Lambda表示式
如果有引數有返回值可使用嗎?
interface Fooi{
public int add(int x,int y);
}
public class LambdaTest {
public static void main(String[] args) {
Fooi foo=(int x,int y)->{
return x+y;
};
System.out.println(foo.add(3,5));
}
}
由此可見,方法有引數有返回值也可以使用Lambda表示式
如何保證介面是函式式介面呢?
使用@FunctionalInterface註解
給介面加上兩個方法,就會報錯。如圖所示:
@FunctionalInterface;
interface Fooi{
public int add(int x,int y);
public void sale();
}
此時會報錯。
如果一個接口裡面有且僅有一個未實現的方法,但沒有加上這個註解,java裡面會隱式的為這個介面加上這個註解
如果一個接口裡面有兩個方法,並且定義了FunctionalInterface註解,就會報異常
Lambda表示式總結
Lambda表示式口訣:拷貝小括號,寫死右箭頭,落地大括號
@FunctionalInterface註解的使用