本文将探讨 JDK 1.8 中引入的新特性 Lambda (λ) 表达式
主要解决以下几个问题:html
接口的方法默认是public abstract,都是抽象方法,而函数式接口则有且仅有一个抽象方法,但能够有多个非抽象方法,一般用注解进行标识java
@FunctionalInterface
这里列举一些JDK 1.8之前经常使用的函数式接口:编程
在JDK 1.8中新增了以下函数式接口:api
由于Java是面向对象的,方法间参数传递须要为对象,而不能是方法,若想向方法传递方法,则须要一个只有一个抽象方法的接口实现类的对象,将这个对象传到方法中就实现了向方法传递方法。
总结:函数式接口即是为了解决向方法传递方法的需求,将须要传递的方法转为一个函数式接口对象(有且仅有一个抽象方法的接口实现类),以此来解决向方法传递方法的需求。数据结构
笔者是这样认为的,大部分问题实际是围绕时间和空间的问题,就像不一样的数据结构是在作时间和空间上的取舍,是为了节约更多空间,而牺牲一点时间,或者是为了节约更多时间,而占用更多空间。
用相同的思考模式去看编程语言的升级其实也是这样的,是为了下降编程难度,使代码更易懂更易用,这样就能够节约更多的时间去作别的,而不是花费过多时间去编码。
而上面的问题其实也是为了让代码更易懂更易用,至于怎么体现出更易懂更易用的,读者能够独自思考思考。多线程
Lambda表达式能够将函数做为一个方法的参数oracle
这就就比如语法糖,能让代码更好写也更好读。但笔者也知道,任何新的东西引入必然带来新的混乱,学习新的知识须要过程,适应也须要过程,但其最终的回报笔者认为是值得的。编程语言
// 方式1、函数式接口 @FunctionalInterface interface ILike { // 接口中的访问修饰符、abstract修饰符是能够省略的 // 由于接口中默认就是抽象方法,又由于接口是须要实现类来实现其中方法的 // 因此访问修饰符默认是public void lambda(); } // 方式1、实现函数式接口中的抽象方法 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(); } }
如有不足,敬请指正
虚心若愚,求知若渴ide