參考:《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());