Lambda表达式

本文介绍了如何使用行为参数化和Lambda表达式简化Java编程,尤其是通过Lambda解决代码冗长问题,以及在函数式接口和环绕执行模式中的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    你了解了利用行为参数化来传递代码有助于应对不断变化的需求。它允许你定义一个代码块来表示一个行为,然后传递它。你可以决定在某一件事发生时(例如单击一个按钮)

或在算法中的某个特定时刻(例如筛选算法中类似于重量超过10克苹果的谓词,或排序中的自定义比较操作)运行该代码块。一般来说,利用这个概念,你就可以编写更为灵活且可重复

使用的代码了。但你也看到,使用匿名类来表示不同的行为并不令人满意:

代码十分啰嗦,这会影响程序员在实践中使用行为参数化的积极性。

你可以把Lambda表达式看作匿名功能,

它基本上就是没有声明名称的方法,

但和匿名类一样,它也可以作为参数传递给一个方法。

Lambda 管中窥豹

可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。这个定义够大的,让我们慢慢道来。

口匿名——我们说匿名,是因为它不像普通的方法那样有一个明确的名称:写得少而想得多!

函数——我们说它是函数,是因为Lambda函数不像方法那样属于某个特定的类。但和方法一样,Lambda有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表。传递——Lambda表达式可以作为参数传递给方法或存储在变量中。

口简洁——无需像匿名类那样写很多模板代码。

你是不是好奇Lambda这个词是从哪儿来的?其实它来自于学术界开发出来的一套用来描述计算的入演算法。你为什么应该关心Lambda表达式呢?你在上一章中看到了,在Java中传递代码十分繁琐和冗长。那么,现在有了好消息! Lambda解决了这个问题:它可以让你十分简明地传递代码。理论上来说,你在Java8之前做不了的事情, Lambda也做不了。但是,现在你用不着再用匿名类写一堆笨重的代码,来体验行为参数化的好处了! Lambda表达式鼓励你采用我们上一章中提到的行为参数化风格。最终结果就是你的代码变得更清晰、更灵活。比如,利用Lambda表达式,你可以更为简洁地自定义一个Comparator对象。

Lambda的基本语法

(parameters) ->expression

(parameters) ->{ statements;}

3.2 在哪里以及如何使用Lambda

你把Lambda赋给了一个Comparator<Apple>类型

的变量。你也可以在上一章中实现filter方法中使用

Lambda

List<Apple> greenApples =

filter(inventory,(Apple a ) ->"green".equals(a.getColor()));

那到底在哪里可以使用Lambda呢?

你可以在函数式接口上使用Lambda表达式。

3.2.1函数式接口

函数式接口就是定义一个抽象方法的接口。

为什么只有在需要函数式接口的时候才可以传递Lambda呢?

3.3把Lambda付诸实践:环绕执行模式

让我们通过一个例子,看看在实践中如何利用Lambda和行为参数化来让代码更为灵活,更为简洁。资源处理(例如处理文件或数据库)时一个常见的模式就是打开一个资源,做一些处理,然后关闭资源。这个设置和清理阶段总是很类似,并且会围绕着执行处理的那些重要代码。这就是所谓的环绕执行(execute around)模式,如图3-2所示。例如,在以下代码中,高亮显示的就是从一个文件中读取一行所需的模板代码(注意你使用了Java 7中的带资源的try语句,它已经简化了代码,因为你不需要显式地关闭资源了):

processFile()抛出IOException if new BufferedReader(new FileReader("data.txt")))

try (BufferedReader br =

返回br.readLine ();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值