1.2 lambda 表达式的语法
1.2 lambda 表达式的语法
还以上一节中的排序为例。我们传递代码来检查某个字符串的长度是否小于另一个字符串的长度,如下所示:
- Integer.compare(first.length(), second.length())
first 和second 是什么呢?它们都是字符串。Java 是一个强类型的语言,因此我们必须同时指定类型,如下:
- (String first, String second)
- -> Integer.compare(first.length(), second.length())
这就是你见到的第一个“lambda 表达式”。这个表达式不仅是一个简单的代码块,还指定了必须传递给代码的所有变量。
为什么要叫这个名字呢?许多年前,在计算机出现之前,有位名叫Alonzo Church的逻辑学家,他想要证明什么样的数学函数是可以有效计算的。(奇怪的是,当时已经存在了许多已知的函数,但是没有人知道怎样去计算它们的值。)他使用希腊字母的lambda(λ)来标记参数。如果他懂Java API 的话,他应该会写下如下代码:
- λfirst.λsecond.Integer.compare(first.length(), second.length())
注意:为什么使用字母λ?难道Church 没有其他拉丁字母可用了吗?事实上,经典的《数学原理》中使用“^”符号表示自由变量,这启发Church 使用大写的lambda“Λ”来表示参数。但是最终,他选择换回到小写版本。于是从那时起,带有参数变量的表达式都被称为lambda 表达式。
你已经见到了Java 中lambda 表达式的格式:参数、箭头 ->,以及一个表达式。如果负责计算的代码无法用一个表达式表示,那么可以用编写方法的方式来编写:即用 {}包裹代码并明确使用return 语句,例如:
- (String first, String second) -> {
- if (first.length() < second.length()) return -1;
- else if (first.length() > second.length()) return 1;
- else return 0;
- }
如果lambda 表达式没有参数,你仍可以提供一对空的小括号,如同不含参数的方法那样:
- () -> { for (int i = 0; i < 1000; i++) doWork(); }
如果一个lambda 表达式的参数类型是可以被推导的,那么就可以省略它们的类型,例如:
- Comparator<String> comp
- = (first, second)// 同(String first, String second) 一样
- -> Integer.compare(first.length(), second.length());
这里,编译器会推导出first 和second 必须是字符串,因为lambda 表达式被赋给了一个字符串比较器(我们将会在下一节详细讲解该赋值过程)。
如果某个方法只含有一个参数,并且该参数的类型可以被推导出来,你甚至可以省略小括号:
- EventHandler<ActionEvent> listener = event ->
- System.out.println("Thanks for clicking!");
- // 无须 (event) -> 或 (ActionEvent event) ->
注意:你可以像对待方法参数一样向lambda 表达式的参数添加注解或者final修饰符,如下。
- (final String name) -> ...
- (@NonNull String name) -> ...
永远不需要为一个lambda 表达式执行返回类型,它总是会从上下文中被推导出来。例如,表达式
- (String first, String second) -> Integer.compare(first.length(), second.length())
可以被使用在期望结果类型为int 的上下文中。
注意:在lambda 表达式中,只在某些分支中返回值(其他分支没有返回值)是不合法的。例如,(int x) -> { if (x >= 0) return 1; }是不合法的。
1.2 lambda 表达式的语法的更多相关文章
- Lambda表达式的语法格式
Lambda表达式的语法格式: 参数列表 => 语句或语句块 “Lambda表达式”是委托的实现方法,所以必须遵循以下规则: 1)“Lambda表达式”的参数数量必须和“委托”的参数数量相同: ...
- Lambda表达式 简介 语法 示例
Lambda 表达式也称为闭包,是匿名类的简短形式.Lambda 表达式简化了[单一抽象方法声明接口]的使用,因此 lambda 表达式也称为功能接口. 在 Java SE 7 中,单一方法接口可使用 ...
- Lambda表达式 简介 语法 示例 匿名内部类
在AS中使用 Lambda 表达式 Demo地址:https://github.com/baiqiantao/MultiTypeTest.git Gradle(Project级别)中添加classpa ...
- 【Java8新特性】Lambda表达式基础语法,都在这儿了!!
写在前面 前面积极响应读者的需求,写了两篇Java新特性的文章.有小伙伴留言说:感觉Lambda表达式很强大啊!一行代码就能够搞定那么多功能!我想学习下Lambda表达式的语法,可以吗?我的回答是:没 ...
- JDK8新特性02 Lambda表达式02_Lambda语法规则
//函数式接口:只有一个抽象方法的接口称为函数式接口. 可以使用注解 @FunctionalInterface 修饰 @FunctionalInterface public interface MyF ...
- Lambda表达式的语法与如何使用Lambda表达式
Lambda表达式是对象,是一个函数式接口的实例 如何来写Lambda表达式? 看参数 看返回值 代码实例1: package day2; import jdk.nashorn.internal.co ...
- Java中lambda(λ)表达式的语法
举一个排序的例子,我们传入代码来检查一个字符串是否比另一个字符串短.这里要计算: first.length() - second.length() first和second是什么?他们都是字符串.Ja ...
- 初探Lambda表达式/Java多核编程【3】Lambda语法与作用域
接上一篇:初探Lambda表达式/Java多核编程[2]并行与组合行为 本节是第二章开篇,前一章已经浅显地将所有新概念点到,书中剩下的部分将对这些概念做一个基础知识的补充与深入探讨实践. 本章将介绍L ...
- C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:
形参列表=>函数体 函数体多于一条语句的可用大括号括起. 类型 可以将此表达式分配给委托类型,如下所示: delegate int del(int i); del myDelegate = ...
随机推荐
- ELF 文件 动态连接 - 延迟绑定(PLT)
PLT 全称:Procedure Linkage Table ,直译:过程连接表 由于在动态连接中,程序的模块之间包含了大量的函数引用,所以在程序开始执行前,动态链接会耗费较多的时间用于模块之间函数引 ...
- 二叉查找树之 Java的实现
参考:http://www.cnblogs.com/skywang12345/p/3576452.html 二叉查找树简介 二叉查找树(Binary Search Tree),又被称为二叉搜索树.它是 ...
- 学习MQ(一) 感知
声明:我的文字里出现的MQ,如没有特殊指明,就是指的IBM的websphere MQ 以前对MQ一无所知! MQ是IBM websphere的系列产品之一,是很好的一个中间件产品.其实我对这列产品并不 ...
- TCP TIME WAIT
根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime) ...
- Jbpm工作流(一)
了解一下什么是Jbpm及特点. jBPM,全称是Java Business Process Management,是一种基于J2EE的轻量级工作流管理系统.jBPM是公开源代码项目,它使用要遵循 Ap ...
- JavaScript中高阶函数
https://zhuanlan.zhihu.com/p/23836323?refer=dreawer 高阶函数就是可以将函数作为另一个函数的参数.例如:将两个数的平方相加,这里匿名函数fn就是函数被 ...
- Java容器:Set
Set和数学中的集合十分类似,在Java中,Set是一种绝不会包含两个相等元素的存储结构.在阅读此文前请阅读Java容器:Map. Set方法 增添方法: boolean add(E e); bool ...
- 图片滚动(UP)的JS代码详解(offsetTop、scrollTop、offsetHeigh)【转】
源地址 信息技术教材配套的光盘里有一段设置图片滚动的JS代码,与网络上差不多,实现思路:一个设定高度并且隐藏超出它高度的内容的容器demo,里面放demo1和 demo2,demo1是滚动内容,dem ...
- Ubuntu下vim中文乱码
在linux中,用vim打开包含中文的文件时,有可能出现乱码 下面的vim配置方法亲测有效 1. 找到你的vimrc文件,也有可能是.vimrc,我的服务器是vimrc,我改的是 有的说建议不要改全局 ...
- 利用Swagger2自动生成对外接口的文档
一直以来做对外的接口文档都比较原始,基本上都是手写的文档传来传去,最近发现了一个新玩具,可以在接口上省去不少麻烦. swagger是一款方便展示的API文档框架.它可以将接口的类型最全面的展示给对方开 ...