Lambda表达式
是JDK8中的语法糖,它的基本格式是:
(参数列表)->{处理过程}
可以看出他只关注传什么参,怎样处理。
举个例子:
//接口Inter里面有个方法function
public interface Inter {
void function();
}
//类A构造方法需要传入Inter 实现类
public class A {
public A(Inter i) {
}
}
//当用匿名内部类实现时新建A时
new A(new Inter() {
public void function() {
接口方法的实现
}
});
//当用Lambda表达式实现时
new A(()->{接口方法的实现});
可以看出 ()->{接口方法的实现} 代替了原来匿名内部类的编写。减少了代码量,但代码的可读性降低了。(在IDEA中可以Alt + 回车 实现匿名内部类和Lambda表达式的互相转换)
一般来说当匿名内部类为接口且只有一个方法需要重写就可以使用Lambda函数
方法泛型
//给方法加了泛型,在基本方法声明中加了<R>,R为参数列表中需要的泛型(可多个)
public <R> int f(R a){
return 1;
}
举个例子
//若有泛型接口,定义里面函数参数类型为T,返回值类型为R
public interface Inter<R, T> {
R function(T t);
}
//若有方法需要传入该接口(此时可对接口中的R,T定义)
public <R, T> R f(Inter<R, T> i){
代码段最后返回R类型(返回值类型可更改)
}
//用匿名内部类创建A时,
f(new Inter<String, Integer>(){
public String function(Intei) {
return i.toString();
}
});
//当用Lambda表达式时
f((Integer i) -> {return i.toString();});
之后还可以进一步简化,原则为:
- 参数类型可省
- 方法体中只有一句代码时大括号、return、分号可省
- 方法只有一个参数时小括号可省
所以还可以简化成
f( i -> i.toString());
经method reference(方法引用)后可化为
f( Object::toString);
(但IDEA转换后为 f((A<String, Integer>) Object::toString); )
其中,方法引用指用 :: 来分割类名或对象与方法名,:: 左侧是类名或对象,:: 右侧是方法名。只有要实现的接口方法的参数列表和实现该接口方法中的方法的参数列表一致时才能使用。(我的理解是在本例中接口方法 function 参数列表为Integer,实现该接口方法中为i.toString,i也为Integer类型,如有错误请告知)
本文参考了三更草堂的B站视频