一、什么是Lambda表达式
Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
Lambda 表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或剪头操作符。它将 Lambda 分为两个部分:左侧:指定了 Lambda 表达式需要的所有参数右侧:指定了 Lambda 体,即 Lambda 表达式要执行的功能
二、Lambda表达式的作用
作用:简化匿名内部类的代码
例如:目的都是产生10条线程,分别用匿名内部类和Lambda表达式来创建。
可以比较明显地看出使用Lambda表达式的代码较为简单
package com.czn.juc;
public class Test {
public static void main(String[] args) {
// 使用内部类创建线程对象
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println("使用匿名内部类创建的线程" + name + "正在执行。。。。。。。");
}
}).start();
}
// 使用Lambda表达式创建对象
Runnable run = () -> {
String name = Thread.currentThread().getName();
System.out.println("使用Lambda表达式创建的线程" + name + "正在执行。。。。。。。");
};
for (int i = 0; i < 10; i++) {
Thread thread = new Thread(run);
thread.start();
}
}
}
运行结果:

三、函数式接口
下面我将逐步介绍Lambda表达式的用法,如有不对之处,请各位读者在评论区中指出,以期共同进步。
定义:
如果接口内只定义一个抽象方法,则该接口称为函数式接口
例如:
@FunctionalInterface //函数式接口注解
interface IMammal {
String NAME = "哺乳动物";
void move(); //唯一的抽象方法
public default void eat() {
System.out.println("哺乳动物正在吃......"); //非抽象方法
}
public static void drink(){
System.out.println("哺乳动物正在喝......."); //非抽象的方法
}
}
如果不确定所写的接口是否为函数式接口,可以使用注解@FunctionalInterface来检验
例如下图,我在接口中自定义了两个public(默认)的方法,在添加注解@FunctionalInterface之后会报错,因为接口中存在两个抽象方法。

来个关于函数式接口的简单小结:
- 接口内只定义一个抽象方法
- 函数式接口可以存在多个default修饰的方法
- 函数式接口中也可以存在多个static修饰的静态方法
- 可以用
@FunctionalInterface注解来检验是否为函数式接口 - 如果接口只有一个方法java默认它为函数式接口,此时可以省略
@FunctionalInterface注解
四、Lambda表达式使用
lambda表达式,必须是函数式接口,必须只有一个方法
Java中Lambda表达式的写法为:
拷贝小括号(),写死右箭头->,落地大括号{...}
,即 ()->{}这种形式
- 拷贝小括号(),即拷贝函数式接口中抽象方法中小括号的全部
- 写死右箭头->,即在小括号左边写上->
- 落地大括号{…},即在->后边加上{},然后在{}里面加上抽象方法的具体逻辑代码
例子1
下面的例子是函数式接口中的抽象方法是没有参数及返回值的
public static void main(String[] args) {
// 函数式接口中的自定义的方法没有参数和返回值,则Lambda中也没有参数和返回值
MyLambda1 ml = () -> {
System.out.println("调用Lambda表达式ml的结果:我是lambda表达式");
};
ml.show();
}
//定义函数式接口
@FunctionalInterface
interface MyLambda1 {
void show();
}
例子2
下面的例子是函数式接口中的抽象方法是有参数及返回值的
public static void main(String[] args) {
// 函数式接口中的自定义的方法有参数和返回值,则Lambda中也有参数和返回值
MyLambda2 ml2 = (int x, int y) -> {
return x + y;
};
int res = ml2.add(5, 6);
System.out.println("调用Lambda表达式ml2的结果:" + res);
}
interface MyLambda2 {
int add(int x, int y);
}
例子3:
下面的这个例子和例子2相似,只是加了default和static修饰的方法,这里主要是提醒读者加了多个default和static修饰的方法依然是函数式接口,因此可以使用Lambda表达式
public static void main(String[] args) {
// 函数式接口中也可以有多个default和static修饰的方法
//但是自定义的方法只能有一个!
MyLambda3 ml3 = (int x, int y) -> {
return x * y;
};
// 调用函数式接口中自定义的方法(有且仅有一个)
int mul = ml3.mul(5, 5);
System.out.println("调用Lambda表达式ml3的结果:" + mul);
// 调用函数式接口中默认的实现方法
ml3.show1();
// 调用函数式接口中静态的方法
MyLambda3.show2();
}
interface MyLambda3 {
// 只能有一个自定义的public抽象方法
int mul(int x, int y);
// 可以有多个默认的实现方法
default void show1() {
System.out.println("函数式接口中可以有默认的方法");
}
// 也可以有多个默认的静态方法
static void show2() {
System.out.println("函数式接口中也可以有静态的方法");
}
}
五、代码汇总
package com.czn.juc;
/**
* lambda表达式的使用
*
* @author 阿楠
*
*/
public class LambdaExpression {
public static void main(String[] args) {
// 函数式接口中的自定义的方法没有参数和返回值,则Lambda中也没有参数和返回值
MyLambda1 ml = () -> {
System.out.println("调用Lambda表达式ml的结果:我是lambda表达式");
};
ml.show();
// 函数式接口中的自定义的方法有参数和返回值,则Lambda中也有参数和返回值
MyLambda2 ml2 = (int x, int y) -> {
return x + y;
};
int res = ml2.add(5, 6);
System.out.println("调用Lambda表达式ml2的结果:" + res);
// 函数式接口中也可以有多个default和static修饰的方法,但是自定义的方法只能有一个!
MyLambda3 ml3 = (int x, int y) -> {
return x * y;
};
// 调用函数式接口中自定义的方法(有且仅有一个)
int mul = ml3.mul(5, 5);
System.out.println("调用Lambda表达式ml3的结果:" + mul);
// 调用函数式接口中默认的实现方法
ml3.show1();
// 调用函数式接口中静态的方法
MyLambda3.show2();
}
}
@FunctionalInterface
interface MyLambda1 {
void show();
}
interface MyLambda2 {
int add(int x, int y);
}
interface MyLambda3 {
// 只能有一个自定义的public方法
int mul(int x, int y);
// 可以有多个默认的实现方法
default void show1() {
System.out.println("函数式接口中可以有默认的方法");
}
// 也可以有多个默认的静态方法
static void show2() {
System.out.println("函数式接口中也可以有静态的方法");
}
}
运行结果:

六、总结
- Lambda表达式主要用于简化匿名内部类的代码,增强可读性
- Lambda表达式的使用需要建立在函数式接口的基础上
- 写法为:()->{},()存放参数,{}存放业务逻辑代码
本文深入探讨了Java中的Lambda表达式,介绍了其概念、语法和使用场景,通过实例对比了Lambda表达式与匿名内部类的区别,展示了如何利用Lambda表达式简化代码,提高代码的可读性和效率。

1531

被折叠的 条评论
为什么被折叠?



