当前位置: 首页 > news >正文

1.2 lambda 表达式的语法

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;  

如果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; }是不合法的。

转载于:https://www.cnblogs.com/songyz/p/6180286.html

相关文章:

  • Lint Code——最多共线的点的个数
  • 【bzoj1433】 ZJOI2009—假期的宿舍
  • 【干货分享】前端面试知识点锦集01(HTML篇)——附答案
  • Liunx面试题
  • 关于面试别问及Spring如何回答思路总结!
  • Js 根据身份证号获取年龄-性别
  • linux下正确安装jsoncpp
  • hive 复杂类型
  • SQL Case when 的使用方法
  • 设计模式--适配器模式Adapter(结构型)
  • 各种文件的mime类型
  • [游戏开发-学习笔记]菜鸟慢慢飞(三)-官方教程学习小心得
  • Object类中getClass()
  • dubbo问题求解
  • 单例模式浅析
  • 分享一款快速APP功能测试工具
  • $translatePartialLoader加载失败及解决方式
  • 【技术性】Search知识
  • Android组件 - 收藏集 - 掘金
  • Js基础——数据类型之Null和Undefined
  • leetcode386. Lexicographical Numbers
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Python_网络编程
  • Sequelize 中文文档 v4 - Getting started - 入门
  • 爱情 北京女病人
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 分享几个不错的工具
  • 那些年我们用过的显示性能指标
  • 驱动程序原理
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • #AngularJS#$sce.trustAsResourceUrl
  • #laravel 通过手动安装依赖PHPExcel#
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $.each()与$(selector).each()
  • ${ }的特别功能
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (译)计算距离、方位和更多经纬度之间的点
  • (轉貼) UML中文FAQ (OO) (UML)
  • 、写入Shellcode到注册表上线
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET 8.0 中有哪些新的变化?
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net Stream篇(六)
  • .net 发送邮件