1.2 lambda 表达式的语法

还以上一节中的排序为例。我们传递代码来检查某个字符串的长度是否小于另一个字符串的长度,如下所示:

  1. Integer.compare(first.length(), second.length())

first 和second 是什么呢?它们都是字符串。Java 是一个强类型的语言,因此我们必须同时指定类型,如下:

  1. (String first, String second)
  2. -> Integer.compare(first.length(), second.length())

这就是你见到的第一个“lambda 表达式”。这个表达式不仅是一个简单的代码块,还指定了必须传递给代码的所有变量。

为什么要叫这个名字呢?许多年前,在计算机出现之前,有位名叫Alonzo Church的逻辑学家,他想要证明什么样的数学函数是可以有效计算的。(奇怪的是,当时已经存在了许多已知的函数,但是没有人知道怎样去计算它们的值。)他使用希腊字母的lambda(λ)来标记参数。如果他懂Java API 的话,他应该会写下如下代码:

  1. λfirst.λsecond.Integer.compare(first.length(), second.length())

注意:为什么使用字母λ?难道Church 没有其他拉丁字母可用了吗?事实上,经典的《数学原理》中使用“^”符号表示自由变量,这启发Church 使用大写的lambda“Λ”来表示参数。但是最终,他选择换回到小写版本。于是从那时起,带有参数变量的表达式都被称为lambda 表达式。

你已经见到了Java 中lambda 表达式的格式:参数、箭头 ->,以及一个表达式。如果负责计算的代码无法用一个表达式表示,那么可以用编写方法的方式来编写:即用 {}包裹代码并明确使用return 语句,例如:

  1. (String first, String second) -> {
  2. if (first.length() < second.length()) return -1;
  3. else if (first.length() > second.length()) return 1;
  4. else return 0;
  5. }

如果lambda 表达式没有参数,你仍可以提供一对空的小括号,如同不含参数的方法那样:

  1. () -> { for (int i = 0; i < 1000; i++) doWork(); }

如果一个lambda 表达式的参数类型是可以被推导的,那么就可以省略它们的类型,例如:

  1. Comparator<String> comp
  2. = (first, second)// 同(String first, String second) 一样
  3. -> Integer.compare(first.length(), second.length());

这里,编译器会推导出first 和second 必须是字符串,因为lambda 表达式被赋给了一个字符串比较器(我们将会在下一节详细讲解该赋值过程)。

如果某个方法只含有一个参数,并且该参数的类型可以被推导出来,你甚至可以省略小括号:

  1. EventHandler<ActionEvent> listener = event ->
  2. System.out.println("Thanks for clicking!");
  3. // 无须 (event) -> 或 (ActionEvent event) ->

注意:你可以像对待方法参数一样向lambda 表达式的参数添加注解或者final修饰符,如下。

  1. (final String name) -> ...
  2. (@NonNull String name) -> ...

永远不需要为一个lambda 表达式执行返回类型,它总是会从上下文中被推导出来。例如,表达式

  1. (String first, String second) -> Integer.compare(first.length(), second.length())

可以被使用在期望结果类型为int 的上下文中。

注意:在lambda 表达式中,只在某些分支中返回值(其他分支没有返回值)是不合法的。例如,(int x) -> { if (x >= 0) return 1; }是不合法的。

1.2 lambda 表达式的语法的更多相关文章

  1. Lambda表达式的语法格式

    Lambda表达式的语法格式: 参数列表 => 语句或语句块 “Lambda表达式”是委托的实现方法,所以必须遵循以下规则: 1)“Lambda表达式”的参数数量必须和“委托”的参数数量相同: ...

  2. Lambda表达式 简介 语法 示例

    Lambda 表达式也称为闭包,是匿名类的简短形式.Lambda 表达式简化了[单一抽象方法声明接口]的使用,因此 lambda 表达式也称为功能接口. 在 Java SE 7 中,单一方法接口可使用 ...

  3. Lambda表达式 简介 语法 示例 匿名内部类

    在AS中使用 Lambda 表达式 Demo地址:https://github.com/baiqiantao/MultiTypeTest.git Gradle(Project级别)中添加classpa ...

  4. 【Java8新特性】Lambda表达式基础语法,都在这儿了!!

    写在前面 前面积极响应读者的需求,写了两篇Java新特性的文章.有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没 ...

  5. JDK8新特性02 Lambda表达式02_Lambda语法规则

    //函数式接口:只有一个抽象方法的接口称为函数式接口. 可以使用注解 @FunctionalInterface 修饰 @FunctionalInterface public interface MyF ...

  6. Lambda表达式的语法与如何使用Lambda表达式

    Lambda表达式是对象,是一个函数式接口的实例 如何来写Lambda表达式? 看参数 看返回值 代码实例1: package day2; import jdk.nashorn.internal.co ...

  7. Java中lambda(λ)表达式的语法

    举一个排序的例子,我们传入代码来检查一个字符串是否比另一个字符串短.这里要计算: first.length() - second.length() first和second是什么?他们都是字符串.Ja ...

  8. 初探Lambda表达式/Java多核编程【3】Lambda语法与作用域

    接上一篇:初探Lambda表达式/Java多核编程[2]并行与组合行为 本节是第二章开篇,前一章已经浅显地将所有新概念点到,书中剩下的部分将对这些概念做一个基础知识的补充与深入探讨实践. 本章将介绍L ...

  9. C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:

    形参列表=>函数体 函数体多于一条语句的可用大括号括起. 类型 可以将此表达式分配给委托类型,如下所示:   delegate int del(int i); del myDelegate = ...

随机推荐

  1. c程序的编译

    linux系统下采用gcc进行编译,而在aix系统下采用xlc 进行编译. 附上aix安装xlc地址:https://www.ibm.com/developerworks/cn/aix/library ...

  2. Mego(04) - NET简单实现EXCEL导入导出

    前言 相信做过信息系统的朋友都会遇到EXCEL导入导出的相关开发,做过不少EXCEL导入导出后总结起来大致有如下几种方式实现: ADO.NET的OldDb或ODBC连接EXCEL使用DataTable ...

  3. Mac环境svn的使用

    在Windows环境中,我们一般使用TortoiseSVN来搭建svn环境.在Mac环境下,由于Mac自带了svn的服务器端和客户端功能,所以我们可以在不装任何第三方软件的前提下使用svn功能,不过还 ...

  4. node_acl 路径通配

    最近做一个基于nodejs的权限管理,查阅了一两天,发现大致是这样的: passportjs node-oauth rbac node_acl express_acl connect-roles 需求 ...

  5. Salesforce Lightning开发学习(二)Component组件开发实践

    lightning的组件区分标准组件.自定义组件和AppExchange组件.标准组件由SF提供,自定义组件由developer自行开发,AppExchange组件由合作伙伴建立.下面我们写一个简单的 ...

  6. Oracle面试过程中常见的二十个问题

    1.冷备份和热备份的不同点以及各自的优点  解答:热备份针对归档模式的数据库,在数据库仍旧处于工作状态时进行备份.而冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库.热备份的优点在于当备份时, ...

  7. CSS3实现多种背景效果

    灵活的背景定位 实现效果: 将背景图定位到距离容器底边 10px 且距离右边 20px 的位置. background-position 方案 实现代码: <div>海盗密码</di ...

  8. R实战 第七篇:网格(grid)

    grid包是R底层的图形系统,可以绘制几乎所有的图形.除了绘制图形之外,grid包还能对图形进行布局.在绘图时,有时候会遇到这样一种情景,客户想把多个代表不同KPI的图形分布到同一个画布(Page)上 ...

  9. Mac 电脑前端环境配置

    恍惚间,好久没有在外面写过随笔了.在阿里的那两年,学到了许多,也成长了许多,认识了很多可爱的人,也明白了很多社会的事.最后种种艰难抉择,我来到了美团成都,一个贫穷落后但更自由开放弹性的地方.已经误以为 ...

  10. Android开发之adb无法连接

    2017/11/14 21:20 Unable to run 'adb': null 21:20 'E:\AndroidSDK\platform-tools\adb.exe start-server' ...