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. 学习Selenium遇到的问题和解决方案

    问题1:IE驱动位数问题,未安装对应的IE,打不开IE浏览器(已解决20180323) 使用Selenium启动IE浏览器的时候,报错,报错信息如下 org.openqa.selenium.remot ...

  2. Loader转换器

    一.简介 webpack本身只能处理js模块,Loader可以理解为模块和资源的转换器,它本身是一个函数,接受文件作为参数,返回转换的结果.因此,我们就能通过require来加载任何类型的模块和文件. ...

  3. Dubbo性能调优参数及原理

    本文是针对 Dubbo 协议调用的调优指导,详细说明常用调优参数的作用域及源码. Dubbo调用模型 常用性能调优参数 参数名 作用范围 默认值 说明 备注 threads provider 200 ...

  4. jsJqGrid

    /*展开收起*/ $(function() { initGridTable(); }); function change() { var flag = $("#searchTitle&quo ...

  5. Javascript、CSS、HTML面试题

    1 JS中的三种弹出式消息提醒(警告窗口.确认窗口.信息输入窗口)的命令是什么? alert     confirm     prompt 2声明一个已经存在一个CSS有几种方式? 1.导入一个已经存 ...

  6. CSS布局之--各种居中

    居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...

  7. 基于Kurento的WebRTC移动视频群聊技术方案

    说在前面的话:视频实时群聊天有三种架构: Mesh架构:终端之间互相连接,没有中心服务器,产生的问题,每个终端都要连接n-1个终端,每个终端的编码和网络压力都很大.群聊人数N不可能太大. Router ...

  8. Java开源生鲜电商平台-系统简介

    Java开源生鲜电商平台-系统简介 1.生鲜电商平台的价值与定位. 生鲜电商平台是一家致力于打造全国餐饮行业智能化.便利化.平台化与透明化服务的创新型移动互联网平台,连接买家与卖家之间的一个平台 看以 ...

  9. Spark核心编程---创建RDD

    创建RDD: 1:使用程序中的集合创建RDD,主要用于进行测试,可以在实际部署到集群运行之前,自己使用集合构造测试数据,来测试后面的spark应用流程. 2:使用本地文件创建RDD,主要用于临时性地处 ...

  10. MQTT入手笔记(二)

    Mosquitto是一个实现了MQTT3.1协议的代理服务器,由MQTT协议创始人之一的Andy Stanford-Clark开发,它为我们提供了非常棒的轻量级数据交换的解决方案.本文的主旨在于记录M ...