函数接口与lambda表达式

此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

 

推荐一个公众号,免费领架构师学习资料,每周更新优质文章,能学到很多。

评论 60
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值