本文章将简要介绍java中lambda的基本知识和使用
一.lambda的构成
lambda表达式的语法结构相对简单,主要由以下几个部分组成:
- lambda关键字: lambda关键字用于标识这是一个lambda表达式,表示即将定义一个匿名函数。
- 参数列表: 参数列表即用括号括起来的形式参数,可以包含零个或多个参数,多个参数之间使用逗号进行分隔。
- 冒号: 冒号用于分隔参数列表和lambda表达式的执行逻辑。
- 表达式主体: 表达式主体定义了lambda表达式的执行逻辑,通常为一个表达式,用于计算返回结果。
lambda表达式的一般形式如下:
lambda arguments: expression
我们现在简单演示一下:
// 1. 不需要参数,返回值为 2
() -> 2
// 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)
二.函数式接口
函数式接口是实现lambda表达式的前提
只能包含一个抽象方法的接口被称为函数式接口。这个抽象方法定义了接口的行为,其他非抽象方法(默认方法、静态方法)不影响接口的函数式特性。
//@FunctionalInterface是函数式接口的标志
@FunctionalInterface
interface MathOperation{
int operation(int a,int b);
}
三.lambda表达式的实现
有了函数式接口后,我们就可以用这个接口实现lambda表达式了
//@FunctionalInterface是函数式接口的标志
@FunctionalInterface
interface MathOperation{
int operation(int a,int b);
}
public class Lambda {
public static void main(String[] args) {
//实现加法函数
MathOperation add=(a,b)->a+b;
//实现减法函数
MathOperation sub=(a,b)->a-b;
//实现乘法函数
MathOperation mul=(a,b)->a*b;
//实现除法函数
MathOperation div=(a,b)->a/b;
//结果展示
System.out.print(add.operation(3,5));
System.out.print(sub.operation(3,5));
System.out.print(mul.operation(3,5));
System.out.print(div.operation(3,5));
}
}
8 -2 15 0
Lambda可以理解为:Lambda就是匿名内部类的简化,实际上是创建了一个类,实现了接口,重写了接口的方法
//匿名内部类的实现方法
MathOperation add2=new MathOperation() {
@Override
public int operation(int a, int b) {
return a+b;
}
};
System.out.println(add2.operation(3,5));
代码精简:
1. 参数类型可以省略,如果需要省略,每个参数的类型都要省略。
2. 参数的小括号里面只有一个参数,那么小括号可以省略
3. 如果方法体当中只有一句代码,那么大括号可以省略
4. 如果方法体中只有一条语句,且是return语句,那么大括号可以省略,且去掉return关键字。
四.变量捕获
我们之前说到lambda就是匿名内部类的简化,我们知道内部类是可以使用外部类的变量的,这被称为变量捕获,同理,lambda也存在变量捕获
我们先看看内部类的变量捕获,代码如下:
//创建好的函数式接口
@FunctionalInterface
interface Fun{
void test();
}
class Test_lambda{
public static void main(String[] args) {
//外部变量a
int a=100;
//这是我们创建好的匿名内部类,它在Test_lambda的内部且没有名字,只是实现了Fun接口
new Fun(){
@Override
public void test() {
//捕获到了外部变量a
System.out.println(a);
}
};
}
}
注意:在上述代码当中的变量a就是捕获的变量。这个变量要么是被final修饰,如果不是被final修饰的,你要保证在使用之前没有修改。不然就会报错
现在来看看lambda的变量捕获
//创建好的函数式接口
@FunctionalInterface
interface Fun{
void test();
}
class Test_lambda{
public static void main(String[] args) {
//外部变量a
int a=100;
//这是我们创建好的lambda表达式
Fun fun=()->{
System.out.println("这是捕捉到的变量a:"+a);
};
}
}
五.总结
Lambda表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。
优点:
1. 代码简洁,开发迅速
2. 方便函数式编程
3. 非常容易进行并行计算
4. Java 引入 Lambda,改善了集合操作
缺点:
1. 代码可读性变差
2. 在非并行计算中,很多计算未必有传统的 for 性能要高
3. 不容易进行调试
到这里,我们的lambda表达式就简单说明完了
标签:函数,int,MathOperation,接口,表达式,lambda From: https://blog.csdn.net/a1806542392/article/details/136623680