此java8特性的文档,都学习与王群锋翻译的《java8函数式编程》。
一、相关概念
1.1 函数式编程
核心:在思考问题时,使用不可变值和函数,函数对一个值进行处理,映射成另一个值。
面向对象编程是对数据进行抽象,而函数式编程是对行为进行抽象。
在写回调函数和事件处理程序时,程序猿不必再纠结于匿名函数内部类的冗繁和可读性,函数式编程让事件处理系统变得更加简单,能将函数方便的传递,也能让编写惰性代码变得简单,惰性代码在真正需要时才初始化变量的值。可学习:此博客。
这种代码更多的表达了业务逻辑的意图,而不是他的实现机制。代码易读也易维护,更可靠,不容易出错。
1.2 匿名内部类
学习博客:https://www.cnblogs.com/chenssy/p/3390871.html
https://blog.csdn.net/guyuealian/article/details/51981163
内部类的好处:
1、简写一个类的代码。
2、可实现java的“多继承”(通过实现不同的接口,来实现的,并非真正多继承),在一个内部类中,可以直接实现外部类没有实现的接口。
左边红色部分就是匿名函数的写法,代替了右面一个类的写法。
对于匿名内部类的使用它是存在一个缺陷的,就是它仅能被使用一次,创建匿名内部类时它会立即创建一个该类的实例,该类的定义会立即消失,所以匿名内部类是不能够被重复使用。
匿名内部类经常用于接口上:
1.3 lambda与匿名内部类
内部类与lambda有什么关系呢?
举例对比:
使用匿名内部类的代码:(使用匿名内部类将行为和按钮单击进行关联)
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.print("Helllo Lambda in actionPerformed");
}
});
在这个例子中,创建了一个新对象(匿名内部类加载的时候,自动实例化一个对象),实现了actionLitener(事件监听器)接口。这个接口只有一个方法actionPerformed。匿名方法内部类实现了这个方法。
设计匿名内部类的目的,就是为了方便java程序猿将代码作为数据传递。不过匿名内部类还是不够方便。匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差!!
所以:lambda!!
Lambda 表达式的应用则使代码变得更加紧凑,可读性增强;
Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU 的优势,更易于为多核处理器编写代码;
上述代码用lambda写:
button.addActionListener(
//actionPerformed 有一个参数 e 传入,所以用 (ActionEvent e)
(ActionEvent e)->
System.out.print("Helllo Lambda in actionPerformed")
);
要使用 Lambda 表达式,需要定义一个函数式接口,这样往往会让程序充斥着过量的仅为 Lambda 表达式服务的函数式接口。为了减少这样过量的函数式接口,Java 8 在 java.util.function 中增加了不少新的函数式(↓)通用接口。
1.4 函数接口
java8引入的核心概念是函数式接口。lambda的本质是一个函数接口。是只有一个抽象方法的接口(↑),用作lambda表达式的类型。lambda表达式可以实例化一个函数式接口。
概念:
如果一个接口定义了唯一一个抽象方法,但是可以有多个非抽象方法的接口。那么这个接口就称为函数式接口
通过在接口里面添加一个抽象方法,可以直接在接口中运行。
注解:@FunctionalInterface(自动识别,默认不用写)
现有的函数接口:http://www.runoob.com/java/java8-functional-interfaces.html
推荐一个公众号,免费领架构师学习资料,每周更新优质文章,能学到很多。