Java 8 的 Lambda 表达式的实现方式还是基于已有的字节码指令,由 Lambda 表达式的方法签名结合上下文并经由 SAM 推断出正确的类型来。Java 8 的 Lambda 完整书写格式是

(type parameter1 [type parameter2, ...type parametern]) -> { statements here }

这种标准格式所表示的就是方法签名。

虽不及其他语言的 Lambda 表达式,像 Swift, Scala 可省略参数部分,可用默认参数名 $0, $1, 或 _, 但 Java 8 的 Lambda 还是可以进行酌情简化

参数类型总是可省略   --     (x, y) -> { x + y; }

参数为一个时,参数括号可省略  --    x -> { System.out.println(x); }

语句为一条时,可省略大括号, 并且语句后不要分号 --  x -> System.out.println(x)

上面更进一步,如果是单条 return 语句,必须把 return 关键字去掉  --  x -> "Hello " + x

就差一点,参数部分总是不能省,无参必须写成 () -> System.out.println("hi")

Java 8 中若要近似的实现无参数部分写法,那就是方法引用了 -- System.out::println

. 参数类型总是可省略, 基本上我们总是省略掉参数类型

interface Function {

void call(String x, String y);

}

void foo(Function f) {

f.call("a", "b");

}

foo((x, y) -> {     //(x, y) 完整写法是 (String x, String y)

System.out.println(x);

System.out.println(y);

});

1

2

3

4

5

6

7

8

9

10

11

12

interfaceFunction{

voidcall(Stringx,Stringy);

}

voidfoo(Functionf){

f.call("a","b");

}

foo((x,y)->{    //(x, y) 完整写法是 (String x, String y)

System.out.println(x);

System.out.println(y);

});

. 参数为一个时,参数括号省略

interface Function {

void call(String x);

}

Function f = x -> {

System.out.println();

System.out.println(x);

};

f.call("Hello");

1

2

3

4

5

6

7

8

9

interfaceFunction{

voidcall(Stringx);

}

Functionf=x->{

System.out.println();

System.out.println(x);

};

f.call("Hello");

. 语句为一条时,可省略大括号, 并且语句后不要分号

interface Function {

void call(String x);

}

void foo(Function f) {

f.call("Hi");

}

foo(x -> System.out.println(x)); //不能写成 foo(x -> System.out.println(x);); 这像话

1

2

3

4

5

6

7

8

9

interfaceFunction{

voidcall(Stringx);

}

voidfoo(Functionf){

f.call("Hi");

}

foo(x->System.out.println(x));//不能写成 foo(x -> System.out.println(x);); 这像话

. 如果是单条 return 语句,省去大括时必须把 return 关键字去掉

interface Function {

void String call(String x);

}

foo(x -> "Hello " + x)

1

2

3

4

5

interfaceFunction{

voidStringcall(Stringx);

}

foo(x->"Hello "+x)

. 参数部分的括号总是需要

interface Function {

void call();

}

Function f = () -> System.out.println();

1

2

3

4

5

interfaceFunction{

voidcall();

}

Functionf=()->System.out.println();

不写出 -> 来似乎不知道这是一个 Lambda.

Java  8 中目前还无法简化成类似于 Swift/Scala 中的 foo(System.out.println()) 或 foo {System.out.println()}。不过可以采用方法引用的方式,只是方法引用有其缺陷--不能捕获外部变量。

public class TestLambda {

public static void main(String[] args) {

foo(TestLambda::todo); //todo 方法的签名正好是 x -> String

}

static void foo(Function f){

System.out.println(f.call("World"));

}

static String todo(String x) { //也就是这个方法正好符合 Function 的 SAM 方法签名

return "Hello " + x;

}

}

interface Function {

String call(String x);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

publicclassTestLambda{

publicstaticvoidmain(String[]args){

foo(TestLambda::todo);//todo 方法的签名正好是 x -> String

}

staticvoidfoo(Functionf){

System.out.println(f.call("World"));

}

staticStringtodo(Stringx){//也就是这个方法正好符合 Function 的 SAM 方法签名

return"Hello "+x;

}

}

interfaceFunction{

Stringcall(Stringx);

}

前面说过用方法引用的缺陷是无法捕外部变量,譬如用 Lambda 的方式

String external = "ABC";

foo(x -> external + x);

1

2

Stringexternal="ABC";

foo(x->external+x);

而在前面的 todo 方法中却访问不到 external 变量,如果给 todo 再增加一个参数来传递 external 则不符合 Function 的 SAM 的签名了。

除非,除非用实例的方法引用,那么需要每次传入外部参数来构造实例,例如这样

public class TestLambda {

public static void main(String[] args) {

String external = "ABC";

foo(new MethodProvider(external)::todo); //输出 Hello ABC World

}

static void foo(Function f){

System.out.println(f.call("World"));

}

}

class MethodProvider {

private String _external;

public MethodProvider(String external) {

this._external = external;

}

String todo(String x) {

return "Hello " + _external + " " + x;

}

}

interface Function {

String call(String x);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

publicclassTestLambda{

publicstaticvoidmain(String[]args){

Stringexternal="ABC";

foo(newMethodProvider(external)::todo);//输出 Hello ABC World

}

staticvoidfoo(Functionf){

System.out.println(f.call("World"));

}

}

classMethodProvider{

privateString_external;

publicMethodProvider(Stringexternal){

this._external=external;

}

Stringtodo(Stringx){

return"Hello "+_external+" "+x;

}

}

interfaceFunction{

Stringcall(Stringx);

}

这样着实有些怪异,而且有点把欲作简化的东西复杂化了。

Java for 语句简化写法_Java 8 Lambda 写法与简化相关推荐

  1. java assert语句未执行_Java陷阱之assert关键字

    转自:http://lavasoft.blog.51cto.com/62575/43735/ Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java ...

  2. java while语句打印三角形_java基础之五小节带你走进java流程控制—多重循环

    四.多重循环 在一个循环语句内部再嵌套一个或多个循环,称为多重循环/嵌套循环.while.do-while与for循环可以任意嵌套,可以嵌套任意多层.一般工作中多见的就是两层. 4.1 多重循环 打印 ...

  3. java内部类写法_Java匿名内部类的写法示例

    前言 在Java中调用某个方法时,如果该方法的参数是一个接口类型,除了可以传入一个参数接口实现类,还可以使用匿名内部类实现接口来作为该方法的参数. 匿名内部类其实就是没有名称的内部类,在调用包含有接口 ...

  4. java switch语句套循环_java中switch语句和循环语句的使用

    java中switch语句和循环语句的使用 发布时间:2020-06-17 10:49:18 来源:亿速云 阅读:121 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java中switch语句 ...

  5. java while语句打印三角形_Java 循环结构

    for, while 及 do...while 顺序结构的程序语句只能被执行一次.如果您想要同样的操作执行多次,,就需要使用循环结构. Java中有三种主要的循环结构: while 循环 do-whi ...

  6. java定时器写法_java定时器的写法是什么样?

    定时器的用法是java核心基础之一,很多特殊功能都需要用到定时器,下面一起来看看定时器是如何编写的吧. 示例:一个具备周期性定时(毫秒级);单时刻定时(秒级);多时刻定时(秒级).后两个时间的设置必须 ...

  7. java分支语句有哪些_Java代码多分支语句优化

    DIEA 我记着if else和switch case语句都可以用命令模式来重构interface dao{    crdu() ;}class ConcreteDao implements dao{ ...

  8. java mysql 语句中 大于 小于 等于 的写法

    在项目中使用 mybatis 写 sql 语句时,遇到需要进行大于小于比较的逻辑,在 sqlyog 中直接写 > 或 < 可以正常运行 sql ,但是项目启动起来就报 sql 错误异常. ...

  9. java 表达式写法_java正则表达式的写法

    展开全部 方法/步骤 Java正则表达式正则表达式的语法知识:Java支持Perl 5 正则表达式语法的一个子集.e69da5e6ba903231313335323631343130323136353 ...

最新文章

  1. [渝粤教育] 西南科技大学 数据库应用 在线考试复习资料
  2. python多线程编程(6): 队列同步
  3. python打包安卓的方法_打包发布Python模块的方法详解
  4. 2.vue的diff算法(2020.12.07)
  5. Python(42)_文件操作
  6. 读取文本节点_Python文本处理教程(2)
  7. 带经纬度的水印相机_水印今日相机安卓版下载-水印相机拍照时间地点app下载v2.8.8.14-西西软件下载...
  8. mac安装多个JDK版本
  9. 信息系统项目管理师必背知识点(完整版)
  10. 利用Matlab App Designer简单设计程序
  11. 信息储存服务器有没有辐射,服务器存储主机存在辐射吗
  12. bzoj3384[Usaco2004 Nov]Apple Catching 接苹果*bzoj1750[Usaco2005 qua]Apple Catching*
  13. 【矩阵论】线性空间与线性变换(5)
  14. 2020 5 PON
  15. 实现营业执照注册号校验
  16. java华容道代码_Java 华容道完整源码
  17. 2022年版中国腰果酚市场趋势研究与竞争策略分析报告
  18. $refs 模拟点击
  19. Vue 3 之什么是 解包
  20. Go实战 | 一文带你搞懂从单队列到优先级队列的实现

热门文章

  1. 【英语学习】【English L06】U03 House L2 Let's look for an apartment online
  2. 【Openstack】实录手动部署Openstack Rocky 双节点(2)- Keystone
  3. 【英语学习】【WOTD】finicky 释义/词源/示例
  4. 软件工程复习笔记 UML
  5. css里面的let,js中let和var定义变量的区别
  6. pythonscrapy爬虫_python爬虫scrapy之如何同时执行多个scrapy爬行任务
  7. ksoap2-android Project
  8. Ai极限真的存在吗?
  9. 七牛解决运营商劫持问题
  10. MBG配置详解及最佳实践