引言
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。java8 新特性非常多,我们这篇主要讲述Lambda表达式。
Lambda表达式,也可以称为闭包,它是推动java 8 发布的最重要新特性。
Lambda允许把函数作为一个方法的参数,函数作为参数传递进方法中。
语法
完整的Lambda表达式由三部分组成:参数列表、箭头、声明语句;
1 | (Type1 param1, Type2 param2, ..., TypeN paramN) -> { statment1; statment2; ...... return statmentM;} |
以下是Lambda表达式的重要特征:
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
(param1,param2, ..., paramN) -> { statment1; statment2; ...... return statmentM;}
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
param1 -> { statment1; statment2; ...... return statmentM;}
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
(param1,param2, ..., paramN) -> statment1
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指明表达式返回了一个数值。
param1 -> statment1
Lambda 表达式实例
Lambda 表达式的简单例子:
1 | // 1. 不需要参数,返回值为 5 |
现在我们在java代码中来实现:
1 | package com.adanblog.demo; |
执行main方法后打印:
1 | 返回5:5 |
变量作用域
Lambda表达式只能引用标记了final的外层局部变量,这就是说不能在lambda内部修改定义在域外的局部变量,否则会编译称为。
代码:
1 | package com.adanblog.demo; |
运行输出:
1 | Hello! 我是Lambda的测试! |
我们也可以直接在lamdba表达式中访问外层的局部变量:
1 | package com.adanblog.demo; |
Lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
在上面例子中,更改变量num的值就会报错
1 | package com.adanblog.demo; |
在lambda表达式当中,不允许声明一个与局部变量同名的参数或者局部变量。
1 | int num=2; |