📔C3 Lambda详解
type
status
date
summary
slug
tags
category
icon
password
这一章的内容包括
1.Lambda表达式概述
2.怎么用Lambda表达式
Lambda表达式概述
Lambda表达式可以被定义为:它没有名字,但有一系列参数、方法体、返回值类型以及可能被抛出的异常。文章将其划分为以下几个特性。
- 匿名。
- 函数:Lambda不像传统方法那样绑定于某个类,但是它具有方法体所有的内容。
- 传递:Lambda表达式可以作为参数传递给方法,或者作为变量用于排序。
- 简洁:不用像编写匿名内部类那样编写函数。
Lambda表达式的组成如下图所示。
通常,它由一些参数、一个箭头和方法体构成。
Lambda的基本语法包括以下两种:
(parameters) -> expression
(parameters) -> {statements; }
注意区分二者的区别,当方法体是一个statement语句时,例如
return
,那么我们需要使用第二种语法;否则使用第一种。何时,如何用Lambda表达式?
Lambda表达式可以在函数式接口(functional interface)的上下文(context)中使用。
函数式接口就是只定义了一个抽象方法的接口。例如常用的
Comparator
和Runnable
接口。注:有些函数式接口可能包含多个默认方法(default method),但如果它只定义了一个抽象方法,那么它仍然是一个函数式接口。
注意,Lambda表达式的签名(signature)必须和接口的方法签名一致。
下面第三个例子,由于Predicate中方法的签名为
Predicate<Apple>:(Apple) -> boolean
,而Lambda表达式的签名为(Apple) -> Integer
,所以该写法是无效的。练习:环绕执行模式
环绕执行模式(execute around pattern)可用下图进行解释。
尝试将下面这段代码优化为Lambda表达式实现。
第一步:行为参数化。
如何让
processFile
方法的行为变成一个参数?答案是Lambda表达式。第二步:使用函数式接口传递行为。
之前提到过,Lambda表达式只能用于函数式接口的上下文。所以,我们需要自己定义一个函数式接口
BufferReaderProcessor
。然后,对
processFile
方法的入参进行改写。第三步:执行行为。
将
processFile
方法的返回值进行修改,以执行我们定义的接口内的方法。第四步:使用Lambda表达式。
现在,我们可以通过Lambda表达式执行特定的操作。
例如,返回第一行:
返回第一、二行:
使用函数式接口
为了使用不同的Lambda表达式,需要一组可以描述常见函数描述符的函数接口,
java.util.function
包内提供了一些例子。函数描述符:函数式接口中抽象方法的签名。
常见的接口包括Predicate,Consumer,Function三种,下面简单作一个介绍。
Predicate
java.util.function.Predicate<T>
接口定义一个名为accpet
的抽象方法,它接收object
对象,并返回boolean
值。Consumer
java.util.function.Consumer<T>
接口定义一个名为accpet
的抽象方法,它接收object
对象,并且返回一个void
值。Function
java.util.function.Function<T, R>
接口定义一个名为apply
的抽象方法,它接收一个泛型对象T,并且返回一个泛型对象R。Prev
C2 Lambda介绍
Next
C4 Streams介绍
Loading...