Java學習筆記---Lambda 表達式(簡潔優雅的生產力)

參考:《Java核心技術》與大神博客

Lambda表達式的作用就是將一塊代碼塊賦給一個Java變量 ,在jdk8之前是沒有Lambda表達式的。Lambda表達式的最主要作用就是讓代碼更加的整潔。所有的Lambda的類型都是一個接口,而Lambda表達式本身就是這個接口的實現。

一、Lanbda表達式對接口要求

Lambda規定接口中只有一個需要被實現的方法,不是規定接口中只有一個方法

jdk8 中有一個新特性,default,被default修飾過的方法會有默認實現,不是必須被實現的方法,所以不影響Lambda表達式的使用
@Functionallnterface 函數式接口,使用了@Functionallnterface的接口將不能在添加其他抽象方法,與Lambda配套使用

二、基本語法

public interface NoReturnMutilParam {
	void menthod(int a , int b);
}
public interface NoReturnOneParam {
	void menthod(int a);
}
public interface NoReturnNoParam {
	void menthod();
}
public interface ReturnNoParam {
	int menthod();
}
public interface ReturnOneParam {
	int menthod(int a);
}

先給出上面6個接口,其中都有menthod方法,但是返回類型,和參數列表不同,下面看不使用Lambda表達式時要使用這個接口的menthod方法代碼

public class LambdaTest implements NoReturnMutilParam {
	@Override
	public void menthod(int a , int b) {
		System.out.println("NoReturnMutilParam" + " " + a + " " + b);
	}
	public static void main(String[] agrs){
		LambdaTest t = new LambdaTest();
		t.menthod(3, 4);
	}
}

如果使用Lambda表達式,要達到同樣的效果只需要幾行代碼

NoReturnMutilParam noreturnmutilparam = (int a , int b) -> {
			System.out.println("NoReturnMutilParam" + " " + a + " " + b);
		};
		noreturnmutilparam.menthod(3, 4);

下面看Lambda的語法,語法形式爲 () -> {},其中 () 用來描述參數列表,{} 用來描述方法體,->爲Lambda表達式運算符。

NoReturnMutilParam noreturnmutilparam = (int a , int b) -> {
			System.out.println("NoReturnMutilParam" + " " + a + " " + b);
		};
		noreturnmutilparam.menthod(3, 4);
		
NoReturnNoParam noreturnnoparam = ()->{
			System.out.println("NoReturnNoParam");
		};
		noreturnnoparam.menthod();
	
ReturnOneParam returnoneparam = (int a) -> {
			System.out.print("ReturnOneoaram");
			return a;
		};
		System.out.println(" " + returnoneparam.menthod(3));

三、語法簡化

//Lambda語法簡化
	//①簡化參數類型,但是必須所有參數都不寫
		NoReturnMutilParam lambda1 = (a ,b) -> {
			System.out.println("lambda1" + " " + a + " " + b);
		};
		lambda1.menthod(0, 1);

		//②如果只有一個參數,可以簡化參數小括號( )
		NoReturnOneParam lambda2 = a -> {
			System.out.println("lambda2" + " " + a);
		};
		lambda2.menthod(2);
		
		//如果方法體只有一條語句,簡化{ }
		NoReturnOneParam lambda3 = a -> System.out.println("lambda3" + " " + a);
		lambda3.menthod(3);
		
		//如果方法體只有1條語句,並且這條語句是return 語句,可以省略return和{ }
		ReturnOneParam lambda4 = a -> a+3;
		System.out.println("lambda4 " + lambda4.menthod(4));

四、例子

(一)String 數組排序,String是對象,其中有Comparable接口,實現了compareTo方法,所以可以直接使用Arrays類中的sort排序,但是使用的是默認的字典順序排序。如果我要使用按長度排序,可以向sort方法傳入一個Comparator對象。

class lengthComparator implements Comparator<String>{
	@Override
	public int compare(String s1 , String s2) {
		return s1.length() - s2.length();
	}
}
public class LambdaTest{
	String[] str = new String[]{"hello" , "world" ,"test" , "lambda"};
	Arrays.sort(str , new lengthComparator());
		for(int i = 0;i<=3;i++) {
			System.out.println(str[i]);
		}	
	}
}

使用Lambda表達式

Arrays.sort(str , (String s1 , String s2) -> s1.length() - s2.length());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章