参考:《疯狂java讲义》、黑马程序猿
在疯狂java讲义中,这么写到:Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口的实例。这样意思是说Lambda表达式是为了简化匿名内部类而出现的,他是为了让匿名内部类更加的简化。传统的函数式编程,强调我应该怎么去做,但是lamda表达式强调的是需要做什么。说了这么多还是有点晕,没关系我们通过代码去了解他。
我们不需要知道太多定义,只需要知道,它是什么,它使用的场景是什么,我该怎么用。
下面我通过一段代码来说明什么是lambda表达式。
匿名内部类代码场景:
在这个例子中,我们定义了一个GreetingService接口,它有一个 greet方法。然后我们创建了一个匿名内部类来实现这个接口,并在main方法中使用这个匿名对象来打印一条消息。
package org.example.lamda;
interface Adder {
int add(int a, int b);
}
public class AdderExample {
public static void main(String[] args) {
// 使用匿名内部类实现Adder接口
Adder adder = new Adder() {
@Override
public int add(int a, int b) {
return a + b;
}
};
// 使用实现的接口对象
int sum = adder.add(5, 10);
System.out.println("两数之和为:" + sum);
}
}
而我们可以通过Lambda表达式就可以进行简化匿名内部类。
怎么进行简化呢?
- lambda表达式可以省略匿名内部类中的new 方法名(){} 这种烦琐的代码。不需要指出重写的方法名字。
- 不需要给出重写的方法的返回值类型,只要给出重写的方法括号以及括号里的形参列表即可
我再图形化演示

图片中忘记标注可以省略形参列表允许省略形参类型
改进之后lambda表达式代码如下:
package org.example.lamda;
// 接口定义保持不变
interface Adderlamda {
int add(int a, int b);
}
public class AdderLambdaExample {
public static void main(String[] args) {
// 使用Lambda表达式实现Adder接口
Adderlamda lambdaAdder = (a, b) -> a + b;
// 使用实现的接口对象
int sum = lambdaAdder.add(5, 10);
System.out.println("lambda表达式两数之和" + sum);
}
}
lambda表达式组成部分
-
形参列表。形参列表允许省略形参类型。如果形参列表中只有 一个参数,甚至连形参列表的圆括号也可以省略。
-
箭头(->)。必须通过英文中画线和大于符号组成
-
代码块。如果代码块只包含一条语句,Lambda表达式允许省略 代码块的花括号,那么这条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。
一个很重要的一点 !!!!!! 并不是所有匿名内部类都可以这样简化,匿名内部类只有一个抽象方法的匿名内部类可以这样进行简化的操作。
Lambda 表 达 式 的 目 标 类 型 必 须 是 “ 函 数 式 接 口 ( functional interface)”。函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。如果还是不是很懂,再接口上增加@FunctionalInterface一个注解,Java 8专门为函数式接口提供了@FunctionalInterface注解, 该注解通常放在接口定义前面,该注解对程序功能没有任何作用,它用于告诉编译器执行更严格检查—检查该接口必须是函数式接口(也是就是说里面只有一个抽象方法),否则编译器就会报错。

还有一些关于lambda表达式1.引用类方法2.引用特定对象的实例方法3.引用某类对象的实例方法4.引用构造器。感觉这些东西都是不重要,不常见,没必要死磕。等用上了在去查。





