📔C3 Lambda详解

type
status
date
summary
slug
tags
category
icon
password
这一章的内容包括 1.Lambda表达式概述 2.怎么用Lambda表达式
 

Lambda表达式概述

Lambda表达式可以被定义为:它没有名字,但有一系列参数、方法体、返回值类型以及可能被抛出的异常。文章将其划分为以下几个特性。
  • 匿名。
  • 函数:Lambda不像传统方法那样绑定于某个类,但是它具有方法体所有的内容。
  • 传递:Lambda表达式可以作为参数传递给方法,或者作为变量用于排序。
  • 简洁:不用像编写匿名内部类那样编写函数。
 
Lambda表达式的组成如下图所示。
notion image
通常,它由一些参数一个箭头方法体构成。
Lambda的基本语法包括以下两种:
(parameters) -> expression
(parameters) -> {statements; }
注意区分二者的区别,当方法体是一个statement语句时,例如return,那么我们需要使用第二种语法;否则使用第一种。

何时,如何用Lambda表达式?

Lambda表达式可以在函数式接口(functional interface)上下文(context)中使用。
 
函数式接口就是只定义了一个抽象方法的接口。例如常用的ComparatorRunnable 接口。
注:有些函数式接口可能包含多个默认方法(default method),但如果它只定义了一个抽象方法,那么它仍然是一个函数式接口。
 
注意,Lambda表达式的签名(signature)必须和接口的方法签名一致
下面第三个例子,由于Predicate中方法的签名为 Predicate<Apple>:(Apple) -> boolean ,而Lambda表达式的签名为(Apple) -> Integer ,所以该写法是无效的。

练习:环绕执行模式

环绕执行模式(execute around pattern)可用下图进行解释
notion image
尝试将下面这段代码优化为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...