JAVA8之lambda表达式详解

Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)

Lambda表达式是JAVA8中提供的一种新的特性,它支持JAVA也能进行简单的“函数式编程”。 

它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。

先看几个例子: 1.使用lambda表达式实现Runnable

640?wx_fmt=png

2.使用lambda表达式实现Comparator

640?wx_fmt=png

3.使用lambda表达式实现ActionListener

640?wx_fmt=png

好了,通过上述的几个例子,大家差不多也能明白了lambda是用来干什么以及好处了。 

显而易见的,好处就是代码量大大减少了!程序逻辑也很清晰明了。 

以前: 

因此JAVA8中就提供了这种“函数式编程”的方法 —— lambda表达式,供我们来更加简明扼要的实现内部匿名类的功能。

什么时候可以使用它?

先说一个名词的概念

函数式接口:Functional Interface. 有且只有一个抽象方法 ,这样的接口就成为函数式接口。 JAVA8的接口可以有多个default方法)

任何函数式接口都可以使用lambda表达式替换。 

lambda表达式只能出现在目标类型为函数式接口的上下文中。

注意: 只能!!! 

场景: 

写法、规则

1. 类型推导 

编译器负责推导lambda表达式的类型。它利用lambda表达式所在上下文所期待的类型进行推导, 

这个被期待的类型被称为目标类型。就是说我们传入的参数可以无需写类型了!

2.变量捕获 

在Java SE 7中,编译器对内部类中引用的外部变量(即捕获的变量)要求非常严格: 

如果捕获的变量没有被声明为final就会产生一个编译错误。 

我们现在放宽了这个限制——对于lambda表达式和内部类, 

我们允许在其中捕获那些符合有效只读(Effectively final)的局部变量。

简单的说,如果一个局部变量在初始化后从未被修改过,那么它就符合有效只读的要求, 

换句话说,加上final后也不会导致编译错误的局部变量就是有效只读变量。

注意:此处和final关键字一样,指的是引用不可改!(感觉没多大意义,还不是用的final)

3.方法引用 

如果我们想要调用的方法拥有一个名字,我们就可以通过它的名字直接调用它。 

Comparator byName = Comparator.comparing(Person::getName); 

此处无需再传入参数,lambda会自动装配成Person类型进来然后执行getName()方法,而后返回getName()的String

方法引用有很多种,它们的语法如下:

静态方法引用:ClassName::methodName 

实例上的实例方法引用:instanceReference::methodName 

超类上的实例方法引用:super::methodName 

类型上的实例方法引用:ClassName::methodName 

构造方法引用:Class::new 

数组构造方法引用:TypeName[]::new

4.JAVA提供给我们的SAM接口 

Java SE 8中增加了一个新的包:java.util.function,它里面包含了常用的函数式接口,例如:

640?wx_fmt=png

那么在参数为这些接口的地方,我们就可以直接使用lambda表达式了!

推荐一个美丽与实力共存的公众号,欢迎骚扰哦

640?wx_fmt=png

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值