博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1.2 lambda 表达式的语法
阅读量:5011 次
发布时间:2019-06-12

本文共 1857 字,大约阅读时间需要 6 分钟。

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

你可能感兴趣的文章
利用vagrant打包系统--制作自己的box
查看>>
美女与硬币问题
查看>>
计算几何算法概览 (转)
查看>>
Notepad++的ftp远程编辑功能
查看>>
数据库多对多关联表(Python&MySQL)
查看>>
[实变函数]1.2 集合的运算
查看>>
第06天
查看>>
设计模式的征途—5.原型(Prototype)模式
查看>>
iOS10 app连接不上网络的问题
查看>>
结对开发之电梯调度最终稿(徐梦迪&刘博)
查看>>
simple java mail
查看>>
信息建模
查看>>
Mybatis 数据库物理分页插件 PageHelper
查看>>
虚函数、纯虚函数详解
查看>>
z-stack中数据的发送,广播、组播、点对点
查看>>
Practial Vim 学习笔记一
查看>>
.NET中使用js实现百度搜索下拉提示效果[不是局部刷新,呜呜。。]
查看>>
ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP入门)
查看>>
关于二维码“QR”的6大注意事项
查看>>
MySQL - 常用命令及常用查询SQL
查看>>