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. python下实现二叉堆以及堆排序

    python下实现二叉堆以及堆排序 堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序.堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势. 堆分为大头堆和小头堆 ...

  2. angular4 ionic3 app

    对于angular系列来说,从2到4仅仅是版本号的变更,绝大部分都是兼容的.  如果按照规范编写代码,一般来说是没有问题的. 学习angular4     快速入门参考  https://www.an ...

  3. Struts优缺点

    跟Tomcat.Turbine等诸多Apache项目一样,是开源软件,这是它的一大优点.使开发者能更深入的了解其内部实现机制. Struts开放源码框架的创建是为了使开发者在构建基于Java Serv ...

  4. 前端到docker入门

    Docker的诞生 我们总是会遇到测试对开发说项目又不work了,开发总说:在我电脑上是ok的阿. 项目组加了新人,我们就需要教新人配置各种开发环境,每换一台机器就要配置一次,每来一个新人就要配置一次 ...

  5. Day24 中间件 自定义分页 ModelForm 序列化 缓存 信号

    在views里边,怎么导入局部配置和全局配置 from s18day24 import settings #这样导入的是仅仅用户自定义的配置 from django.conf import setti ...

  6. Drupal7.8的安装注意的问题

    首先推荐在安装之前,首先阅读一下官方的Installation guide ,说实话话,这玩意安装没有Joomla安装那么平滑,大多数问题,guide都会提到.我是先安装后看的这个guide,比较折腾 ...

  7. c#之多线程之为所欲为

    一 什么是多线程 1. 什么是进程?一个 exe 运行一次就会产生一个进程,一个 exe 的多个进程之 间数据互相隔离. 2. 一个进程里至少有一个线程:主线程.我们平时写的控制台程序默认就是单线程的 ...

  8. Jenkins实现Android自动化打包

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/77102359 本文出自[赵彦军的博客] 1.Tomcat 进入 https://t ...

  9. Ocelot中文文档-授权

    Ocelot支持基于声明的授权. 这意味着如果您有要授权的路由,您可以将以下内容添加到您的ReRoute配置中. "RouteClaimsRequirement": { " ...

  10. C#更改操作系统时间

    using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...