Lambda表达式
lambda表达式介绍
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
将仅有一个方法
的接口
作为函数,不再需要复杂地编写它的实现类和实现方法。
而是使用简介的书写方式代替繁琐的步骤。
lambda表达式使用
有一个Animal接口,它有一个 run() 方法。使用测试类的方法调用该接口的方法。
我们在lambda表达式之前使用匿名内部类形式:
public class Test1 {
public static void main(String[] args) {
run(new Animal() {
@Override
public void run() {
System.out.println("跑起来了...");
}
});
}
public static void run(Animal animal){
animal.run();
}
interface Animal{
void run();
}
}
我们再使用lambda表达式:
public class Test2 {
public static void main(String[] args) {
run(()->{
System.out.println("跑起来...");
});
}
public static void run(Animal animal){
animal.run();
}
interface Animal{
void run();
}
}
可以看到方法体内的接口不需要再new出来,而是直接使用:
()->{System.out.println("跑起来...");
这是接口内方法无参数且无返回值的形式,那么有参数,有返回值的呢?
public class Test3 {
public static void main(String[] args) {
//Animal接口内方法有参数有返回值
String s= run("小马",(name)->{
return (name+"跑得快...");
});
System.out.println(s);
}
public static String run(String name,Animal animal){
return animal.run(name);
}
interface Animal{
String run(String name);
}
}
可以优化的情况:
- 可选类型声明: 不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号: 一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号: 如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字: 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。
变量作用域:
- lambda表达式可以引用外部的变量,但不允许修改
public static void main(String[] args) {
//Animal接口内方法有参数有返回值
String horse = "小马驹";
String s= run("小马",(name)-> {
horse = "大马猴"; //编译错误,不能修改外部变量的值
return (name + "跑得快...");
});
System.out.println(s);
}
- lambda表达式参数和大括号内不允许定义和外部变量相同名字的变量