利用行为参数化来传递代码有助于应对不断变化的需求。它允许你定义一段代码块来表示一个行为,然后传递它。
采用匿名类来表示多种行为并不令人满意:代码十分啰唆,这会影响程序员在实践中使用行为参数化的积极性。

3.1 Lambda 管中窥豹

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

  • 匿名——说它是匿名的,因为它不像普通的方法那样有一个明确的名称:写得少而想得多!
  • 函数——说它是一种函数,是因为 Lambda 函数不像方法那样属于某个特定的类。但和方法一样,Lambda 有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表。
  • 传递——Lambda 表达式可以作为参数传递给方法或存储在变量中。
  • 简洁——你无须像匿名类那样写很多模板代码。

Lambda 解决了这个问题:它可以让你十分简明地传递代码。理论上来说,你在 Java 8 之前做不了的事情,Lambda 也做不了.
利用 Lambda 表达式,你可以更为简洁地自定义一个 Comparator 对象。

之前
Comparator<Apple> byWeight = new Comparator<Apple>() { public int compare(Apple a1, Apple a2){ return a1.getWeight().compareTo(a2.getWeight()); }
}; 现在 lambda方式
Comparator<Apple> byWeight =  (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());

lambda有三个部分:

  • 参数列表——这里它采用了 Comparator 中 compare 方法的参数,两个 Apple。
  • 箭头——箭头 -> 把参数列表与 Lambda 主体分隔开。
  • Lambda 主体——比较两个 Apple 的重量。表达式就是 Lambda 的返回值。

例子:

Lambda 表达式具有一个 String 类型的参数并返回一个 int。Lambda 没有 return 语句,因为已经隐含了 return
(String s) -> s.length() Lambda表达式有一个Apple类型的参数并返回一个 boolean(苹果的重量是否超过 150 克)
(Apple a) -> a.getWeight() > 150Lambda 表达式具有两个 int 类型的参数而没有返回值(void返回)。注意 Lambda 表达式可以包含多行语句,这里是两行
(int x, int y) -> { System.out.println("Result:"); System.out.println(x + y);
} Lambda 表达式没有参数,返回一个 int
() -> 42 Lambda表达式具有两个 Apple 类型的参数,返回一个 int:比较两个 Apple 的重量
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()) 基本语法
(parameters) -> expression
块风格
(parameters) -> { statements; }

测验 3.1:Lambda 语法
以下哪个不是有效的 Lambda 表达式?
(1) () -> {}
(2) () -> “Raoul”
(3) () -> {return “Mario”;}
(4) (Integer i) -> return “Alan” + i;
(5) (String s) -> {“Iron Man”;}
答案:只有(4)和(5)是无效的 Lambda,其余都是有效的。详细解释如下。
(1) 这个 Lambda 没有参数,并返回 void。它类似于主体为空的方法:public void run() {}。一个有趣的事实:这种 Lambda 也经常被叫作“汉堡型 Lambda”。 如果只从一边看,它的形状就像是两块圆面包组成的汉堡。
(2) 这个 Lambda 没有参数,并返回 String 作为表达式。
(3) 这个 Lambda 没有参数,并返回 String(利用显式返回语句)。
(4) return 是一个控制流语句。要使此 Lambda 有效,需要使用花括号,如下所示:(Integer i) -> {return “Alan” + i;}
(5)“Iron Man”是一个表达式,不是一个语句。要使此 Lambda 有效,可以去除花括号和
分号,如下所示:
(String s) -> “Iron Man”
或者如果你喜欢,可以使用显式返回语句,如下所示:
(String s) -> {return “Iron Man”;}

3.2 在哪里以及如何使用 Lambda

可以在函数式接口上使用 Lambda 表达式。但是方法参数需要是这个Predicate类型的

3.2.1 函数式接口

Predicate 它就是一个函数式接口
函数式接口就是只定义一个抽象方法的接口。 Java API 中的一些其他函数式接口

下面哪些接口是函数式接口?
public interface Adder {
int add(int a, int b);
}
public interface SmartAdder extends Adder {
int add(double a, double b);
}
public interface Nothing {
}
答案:只有 Adder 是函数式接口
SmartAdder 不是函数式接口,因为它定义了两个叫作 add 的抽象方法(其中一个是从Adder 那里继承来的)。
Nothing 也不是函数式接口,因为它没有声明抽象方法

用函数式接口可以干什么呢?Lambda 表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(具体说来,是函数式接口一个具体实现的实例)

3.2.2 函数描述符

函数式接口的抽象方法的签名基本上就是 Lambda 表达式的签名。我们将这种抽象方法叫作函数描述符
Runnable 接口可以看作一个什么也不接受什么也不返回(void)的函数的签名,因为它只有一个叫作 run 的抽象方法,这个方法什么也不接受,什么也不返回(void)。

Lambda 及空方法调用
虽然下面这种 Lambda 表达式调用看起来很奇怪,但是合法的:
process(() -> System.out.println(“This is awesome”));
System.out.println 返回 void,所以很明显这不是一个表达式!为什么不像下面这样用花括号环绕方法体呢?
process(() -> { System.out.println(“This is awesome”); });
结果表明,方法调用的返回值为空时,Java 语言规范有一条特殊的规定。这种情况下,你不需要使用括号环绕返回值为空的单行方法调用。

以下哪些是使用 Lambda 表达式的有效方式?
(1) execute(() -> {});
public void execute(Runnable r){ r.run(); }
(2) public Callable fetch() { return () -> “Tricky example

《Java8实战》第3章 Lambda 表达式相关推荐

  1. 第三章 Lambda 表达式

    2019独角兽企业重金招聘Python工程师标准>>> 一.Lambda管中窥豹 1.lambda没有名称,但它有参数列表,函数主体,返回类型,可能还有一个可以抛出的异常列表. 2. ...

  2. C++Primer 第10章lambda表达式

    C++Primer 第10章lambda表达式 泛型编程 咱们继续高歌猛进,下面我给大家继续讲关于算法的故事. 我们知道标准库容器中定义的算法大多数独立在算法之外,通常这些算法是通用的.它们可以处理不 ...

  3. Java8新特性1:lambda表达式入门--由浅入深,从单发步枪迈向自动步枪

    本文主要参照<java8 in action>书中对lambda的讲解,来循序渐进的引入lambda表达式,了解我们为什么,以及怎么样初步学会使用lambda表达式,看完以后你会恍然大悟, ...

  4. 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】

    深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...

  5. Java8函数式编程_9--使用Lambda表达式编写并发程序

    1,免责声明,本文大部分内容摘自<Java8函数式编程>.在这本书的基础上,根据自己的理解和网上一些博文,精简或者修改.本次分享的内容,只用于技术分享,不作为任何商业用途.当然这本书是非常 ...

  6. Java8之——简洁优雅的Lambda表达式

    Java8发布之后,Lambda表达式,Stream等等之类的字眼边慢慢出现在我们字眼.就像是Java7出现了之后,大家看到了"钻石语法",看到了try-with-resource ...

  7. java lambda表达式_凯哥带你从零学大数据系列之Java篇---第二十二章:Lambda表达式...

    温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...

  8. java8 ie_Java8语法糖之Lambda表达式_Hudie.的博客-CSDN博客

    原文作者:编程一只蝶 原文标题:Java8语法糖之Lambda表达式 发布时间:2021-02-16 13:08:40 一.Lambda表达式简介 Lambda表达式,是Java8的一个新特性,也是J ...

  9. Java8新特性总结 - 3. Lambda表达式

    所有示例代码打包下载 : 点击打开链接 Java8新特性 :  接口新增默认方法和静态方法 Optional类 Lambda表达式 方法引用 Stream API - 函数式操作流元素集合 Date/ ...

最新文章

  1. AVL树---平衡的二叉查找树
  2. 《大话设计模式》读书笔记-第8章 工厂方法模式
  3. php开启curl和openssl
  4. mongoose获取最高分
  5. LeetCode(1002)——查找常用字符(JavaScript)
  6. 【GNN】图网络|图神经网络(GNN)结构化数据分析
  7. 新版qq虚拟摄像头颜色不正常_云答辩 | QQ群“视频通话”来了
  8. XCOM V2.6串口助手
  9. 建筑企业并购:人才整合的三大误区
  10. 最新!腾讯优图联合厦门大学发布:2021十大人工智能趋势!无监督/多模态等热点...
  11. 在职MBA与普研、MEM是有区别的
  12. 眼球追踪技术 Unity+ HTC vive Pro + DroolonF1 (二)
  13. python 共享内存 c_python共享内存 - DK's Blog - 博客园
  14. 优秀!95后程序员月薪2万背电脑送外卖,送单途中修bug!
  15. 关于iOS 10从2017年1月1日起苹果不允许我们通过这个方法跳过ATS的方法
  16. sql 累计占比_SQL语句-求总和的百分比
  17. SimpleDateFormat api
  18. JS–for循环嵌套
  19. q某音乐API接口分析--获取vKey和Sign
  20. 基于omi的omim-tag组件

热门文章

  1. .NET获取枚举DescriptionAttribute描述信息性能改进的多种方法
  2. kotlin-协程-lzf
  3. 百度地图自定义标点。
  4. 华为模拟器eNSP基本命令
  5. 如何搭建一个docker容器
  6. IDEA 新手使用手册
  7. html使用 katex 数学公式
  8. JOL(java object layout --java 对象内存布局)
  9. 打开浏览器,显示的首页是2345浏览器
  10. hbase 常用命令行操作总结