Java Lambda表达式
简介
Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。
语法
(parameters) -> expression
或
(parameters) ->{ statements; }
特征:
- 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
- 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
- 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
- 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
实例
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)
// 6. 遍历集合
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.forEach(str -> System.out.println(str));
Lambda表达式和匿名内部类的区别
所需不同:
匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
Lambda表达式:只能是接口
使用限制不同:
如何接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
如果接口中多于一个抽象方法,只能使用匿名内部类,不能使用Lambda表达式
实现原理不同:
匿名内部类:编译之后产生一个单独的.class字节码文件
Lambda表达式:编译之后,没有产生一个单独的.class字节码文件,对应的字节码文件会在运行的时候动态生成
例子:
public class LambdaDemo {
public static void main(String[] args) {
//匿名内部类
useEntity(new Entity(){
@Override
public void use() {
System.out.println("匿名内部类:重写实体类方法");
}
});
useAbstr(new Abstr() {
@Override
public void method() {
System.out.println("匿名内部类:实现抽象类方法");
}
});
useInter(new Inter() {
@Override
public void show1() {
System.out.println("匿名内部类:实现接口方法1");
}
@Override
public void show2() {
System.out.println("匿名内部类:实现接口方法2");
}
});
//Lambda
useEntity(()->{System.out.println("Lambda:实体类");}); //Target type of a lambda conversion must be an interface
useAbstr(()->{System.out.println("Lambda:抽象类");}); //Target type of a lambda conversion must be an interface
useInter(()->{System.out.println("Lambda:接口"); }); //Multiple non-overriding abstract methods found in interface
List<String> list = new ArrayList<>();
list.forEach(str -> System.out.println(str));
}
public static void useEntity(Entity entity){
entity.use();
}
public static void useAbstr(Abstr abstr){
abstr.method();
}
public static void useInter(Inter inter){
inter.show1();
inter.show2();
}
}
/**
* 实体类
*/
public class Entity {
public void use(){
System.out.println("Hello Entity");
}
}
/**
* 抽象类
*/
public abstract class Abstr {
public abstract void method();
}
/**
* 接口
*/
public interface Inter {
void show1();
void show2();
}
参考文章:
菜鸟教程:https://www.runoob.com/java/java8-lambda-expressions.html
Java基础-Lambda表达式和匿名内部类的区别:https://blog.csdn.net/weixin_44375501/article/details/109378288