Lambda 表达式,也可称为闭包, 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
Lambda 的语法:
-
(参数) -> expression
-
(参数) -> { statements; }
Lambda 的语法特性
- 使用
->
分割 Lambda 参数和处理语句 - 可选类型声明(不需要声明参数类型,编译器可统一识别参数值)
- 可选参数圆括号(如果只有一个参数,可以不加圆括号,多个参数必须加圆括号)
- 可选花括号(一个语句可以不加花括号,多个参数需要花括号)
- 返回值可选(如果只有一个表达式,可以自动返回,大括号需要指定明表达式返回了一个数值)
变量作用域
Lambda 中引用的外部变量必须为 final 类型,内部声明的变量不可修改,内部声明的变量名称不能与外部变量名相同。
函数接口:
只有一个抽象函数的接口,函数接口使用注解 @FunctionalInterface 进行声明(注解声明不是必须的,如果没有注解,也是只有一个抽象函数,依旧会被认为是函数接口)多一个或者少一个抽象函数都不能定义为函数接口,如果使用了函数接口注解又不止一个抽象函数,那么编译器会拒绝编译。函数接口在使用时候可以隐式的转换成 Lambda 表达式。
定义函数接口
@FunctionalInterface
public interface FunctionInterfaceDemo {
void say(String name, String college);
}
测试代码:
public static void main(String[] args) {
FunctionInterfaceDemo demo = (name,college)-> System.out.println("我叫" + name + ",毕业于" + college + "。");
demo.say("叶辰","北京大学");
}
运行结果:
简单应用
流式操作去重和过滤
public static void main(String[] args) {
List<String> books = Arrays.asList("book1", "book2", "book3", "book1");
System.out.println("去重遍历结果:");
// 去重遍历
books.stream().distinct().forEach(System.out::println);
System.out.println("去重,并过滤掉book3 遍历结果:");
// 去重,并过滤掉book3 再遍历
books.stream().distinct().filter(skill -> !("book3").equals(skill)).forEach(System.out::println);
}
运行结果:
参考资料: 菜鸟教程-Java 8 Lambda 表达式