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