一、引言
本文将探讨 JDK 1.8 中引入的新特性 Lambda (λ) 表达式
主要解决如下几个问题:
- 什么是函数式接口?
- 函数式接口的作用是什么?
- 什么是 Lambda 表达式?
- Lambda 表达式的作用是什么?
- Lambda 表达式的演化过程
- Lambda 表达式的简化过程
二、什么是函数式接口
接口的方法默认是public abstract,都是抽象方法,而函数式接口则有且仅有一个抽象方法,但可以有多个非抽象方法,通常用注解进行标识
@FunctionalInterface
这里列举一些JDK 1.8以前常用的函数式接口:
- java.lang.Runnable
- java.util.concurrent.Callable
- java.util.Comparator
- java.io.FileFilter
- java.awt.event.ActionListener
在JDK 1.8中新增了如下函数式接口:
- Consumer(类似于消费者需要传入参数无返回值)
- Supplier(类似于生产者不需要传入参数,但有返回值)
- Function(有输入也有返回)
- Predicate(判断函数,有输入也有返回,返回true or false
三、函数式接口的作用是什么?
因为Java是面向对象的,方法间参数传递需要为对象,而不能是方法,若想向方法传递方法,则需要一个只有一个抽象方法的接口实现类的对象,将这个对象传到方法中就实现了向方法传递方法。
总结:函数式接口便是为了解决向方法传递方法的需求,将需要传递的方法转为一个函数式接口对象(有且仅有一个抽象方法的接口实现类),以此来解决向方法传递方法的需求。
3.1 进一步再思考一个问题 “为什么要向方法传递方法?”
笔者是这样认为的,大部分问题实际是围绕时间和空间的问题,就像不同的数据结构是在做时间和空间上的取舍,是为了节约更多空间,而牺牲一点时间,或者是为了节约更多时间,而占用更多空间。
用相同的思考模式去看编程语言的升级其实也是这样的,是为了降低编程难度,使代码更易懂更易用,这样就可以节约更多的时间去做别的,而不是花费过多时间去编码。
而上面的问题其实也是为了让代码更易懂更易用,至于怎么体现出更易懂更易用的,读者可以独自思考思考。
四、什么是 Lambda 表达式?
Lambda表达式可以将函数作为一个方法的参数
五、Lambda 表达式的作用是什么?
- 避免匿名内部类定义过多
- 让代码更简洁,更易读
- 去掉过多冗余、修饰性的代码,只保留核心逻辑
这就就好比语法糖,能让代码更好写也更好读。但笔者也知道,任何新的东西引入必然带来新的混乱,学习新的知识需要过程,适应也需要过程,但其最终的回报笔者认为是值得的。
六、Lambda 表达式的演化、简化过程
// 方式一、函数式接口
@FunctionalInterface
interface ILike {
// 接口中的访问修饰符、abstract修饰符是可以省略的
// 因为接口中默认就是抽象方法,又因为接口是需要实现类来实现其中方法的
// 所以访问修饰符默认是public
void lambda();
}
// 方式一、实现函数式接口中的抽象方法
class Like implements ILike {
@Override
public void lambda() {
System.out.println("Lambda 1");
}
}
public class TestLambda {
// 方式二:静态内部类
static class Like1 implements ILike {
@Override
public void lambda() {
System.out.println("Lambda 2");
}
}
public static void main(String[] args) {
// 方式一:函数式接口
ILike like = new Like();
like.lambda();
// 方式二:静态内部类
like = new Like1();
like.lambda();
// 方式三:局部内部类
class Like2 implements ILike {
@Override
public void lambda() {
System.out.println("Lamdba 3");
}
}
like = new Like2();
like.lambda();
// 方式四:匿名内部类,没有类的名称,必须借助接口或父类
like = new ILike() {
@Override
public void lambda() {
System.out.println("Lamdba 4");
}
};
like.lambda();
// 方式五:Lamdba表达式,只保留具体的方法
// 前提是必须为函数式接口
like = () -> {
System.out.println("Lambda 5");
};
like.lambda();
}
}
七、参考
八、最后
若有不足,敬请指正
虚心若愚,求知若渴
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。