一、引言
本文将探讨 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 表达式的演变、简化过程
// 形式一、函数式接口@FunctionalInterfaceinterface 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(); }}
七、参考
- Package java.util.function
- 【狂神说Java】多线程详解
八、最初
若有有余,敬请斧正
虚心若愚,求知若渴