1. 程式人生 > 其它 >Java基礎-Lambda表示式

Java基礎-Lambda表示式

技術標籤:Javajava

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註解的使用