java+拉姆达表达式_Java:lambda表达式

本文内容: lambda表达式的介绍

lambda表达式的语法

lambda表达式实现函数式接口

lambda表达式与Java自带的函数式接口的配合使用

首发日期:2018-07-27

lambda表达式的介绍 lambda表达式是java8新增的特性

lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(函数式接口)

lambda表达式的语法:

语法: (形参列表) ->{代码块}7095ad5448a75ea01efd92df0620d2b7.png 只有一条语句时,可以省去{}a980b7d44489216b8b532acfc12c035d.png

形参为空时,要保留();一个参数时,可以没有括号

当接口中定义了返回值时,表达式需要显示指定返回值;当只有一条语句时,会自动返回这条语句的值cb1109a01feff51e9263c4649df537df.png

(形参列表) ->表达式    1f950c3385d0f99dfd80826a92b70adc.png 由于使用表达式时,是默认返回表达式的值的,所以接口那里需要定义合适的返回值。比如右边的a+b,接口处不能定义成void6478410645dd0cb03df6e79889643361.png

lambda表达式与函数式接口:

lambda表达式的目标类型必须是函数式接口。lambda通常用来实现函数式接口。

什么是函数式接口?

1.是一个接口

2.只有一个抽象函数

3.可以有默认函数(如toString等默认函数,大部分是Object中的同名函数)【这里给一个为什么接口会有类似继承自Object的函数的原因:https://blog.csdn.net/xidiancoder/article/details/78011148】

a0c166324bb0274a24e4cfd728b606c6.png

表达式的变量的作用域问题: 如果你这样写c81b54a16074db5688ce0d0284333f99.png,你会发现他报错了,说明这里的并不是纯粹的局部变量,它是可以访问外部的。

你这样写3f92dfafc49b3a75c2f61ba76ec2fc9f.png,会发现是可以运行的。ebc0e37352df9fc4d6eebdf9be625d9e.png

在lambda中无法修改外部变量。

在lambda中定义的变量,外部是无法使用的。

lambda表达式实现函数式接口

相信看过上面的内容,你已经了解函数式接口了。下面介绍如果利用lambda表达式实现函数式接口。

8ac7e09d31b72e0bfa61a6bcc4da94f4.png

普通的实现方法有很多,可以创建一个实名类来实现接口,也可以利用匿名类来实现:

1.创建一个实名类来实现接口

422e178a53e2351dbf173e3561b7ee39.png

2.利用匿名类来实现

25b6b877ca90bb7e03c905adc9c779f8.png

下面用lambda来实现,你会发现lambda确实能节省很多行代码。

51fa2b27442114a1e97acdcd8a5f4580.png

4c50a4663d888c7e43faa3563a1b8450.png---lambda实现->2c90d9d3fdc502ffa4fdb3b2c248dede.png

上面已经演示过:有参数的,没参数的,表达式的,代码块的。下面介绍另一个留心点。

lambda表达式可以说是“任意类型”的,转换成什么取决于“需要什么”。

如上面的,左边是一个接口,那么右边需要一个接口的实现类的对象,于是lambda会去实现这个接口的抽象函数,并创建一个对象返回。

除此之外,还可以放在函数中作为形参,比如:

536a1465e4ad6c300d5f9a3f855e5b02.png这个类的函数需要一个接口作为形参。当我们调用函数时,可以传入一个lambda表达式:

05f3688fb01a8b9e5c388516cec9cf04.png

lambda表达式与Java自带的函数式接口的配合使用

Java有不少自带的函数式接口,下面只以一个为例。

Comparator是Java中用来排序的一个接口,里面有一个compare函数9834f7d718365fa0115dccbfe902b07a.png。很多能传入一个排序对象的函数,通常都是传入一个Comparator的实现类。

比如Arrays中的排序函数就可以传入一个Comparator的实现类。6c2d84246ed9ac9092141abbec5a9b91.png

在不用lambda时,可以有:

1897bb25e8ebc3f497123b1a7ec5afa5.png

使用lambda表达式之后:

affb5fd685ffed4293122ab2792f5a51.png

如你所见,减少了很多代码。所以如果需要传入的对象是一个函数式接口时,不妨考虑使用lambd表达式,这会节省很多代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值