一.认识Lambda
- Lambda表达式专门针对只有一个方法的接口(即函数式接口)
- lambda表达式的基本格式为(x,y...)—>{表达式...};
(1)可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
(2)可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
(3)可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
(4)可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
-
在我的理解看来更像是实现一个函数式接口; x,y...表示抽象方法的入参数,表达式实际上是抽象的具体实现,
比如:
首先定义了一个函数式接口:
public interface Operation{
int operator(int x,int y);
}
其次定义一个方法,入参为该接口类型
public class Test{
public void t(Operation o){
o.operator(x,y);
}
}
最后调用t方法的方式:
- 第一种,也是最古老的一种传入一个Operation接口的实现
public void m(){
t(new Operation(){
@Override
public int operator(int x,int y){
return x*x+y*y;
}
});
}
2.第二种,使用lambda表达式
public void m(){
t((x,y)->x+y);
}
3.第三种,也就是方法引用
(1)首先需要一个方法
public class Other{
public static int other(int m,int n){
return m*n;
}
}
(2)其次在t方法中进行方法引用
public void m(){
t(Other::other);
}
最终的效果就是:
public void m(){
t(new Operation() {
@Override
public int operator(int x, int y) {
return x*x+y*y;
}
});
t((x,y)->x+y);
t(Other::other);
}
比较一下Other类的other方法和Operation接口的operator方法可以看出两个方法都是传入两个int型参数返回一个int类型的值。
我觉得Java8的函数式编程打破了以往的束缚,在以往方法定义了一个类型的入参,在调用方法的时候必须传入该类型的实例。但是函数式接口却打破了这一约束,把函数式接口当作形参感觉更像是传入方法的实现而非接口的实现
- Lambda表达式并非是方法的实现
对于方法的引用我们可以换个写法
public void m(){
t((x,y)->Other.other(x,y));
}
如果不够清晰可以在定义一个方法
public static String another(int x,int y,int z){
return (x*y*z)+"";
}
对该方法的引用如下
public void m(){
t((x,y)->{
String another = Other.another(x, y, 10);
return Integer.parseInt(another);
});
}
通过这个写法可以看出对方法的引用其实是一种对接口实现的简化。
(1)简化了方法调用
(2)简化了返回值
(3)简化了大括号
最后在比较一下几种调用方式:
public void m(){
t(new Operation() {
@Override
public int operator(int x, int y) {
return x*x+y*y;
}
});
t((x,y)->x+y);
t(Other::other);
t((x,y)->Other.other(x,y));
t((x,y)->{
String another = Other.another(x, y, 10);
return Integer.parseInt(another);
});
}
网友评论