lambda表达式

一、函数式接口
只有一个抽象方法的接口,该方法代表了该接口的功能。 如常见的Runnable和Comparator。有时候被称为SAM类型(Single Abstract Method,单抽象方法)。
Object类的方法被称为函数式接口的隐式成员。

二、lambda表达式
1、JDK 8新增特性之一
2、用于增强对多核环境的并行编程能力,以及支持对数据执行管道操作的新流API。
3、lambda表达式本质上是一个匿名方法,这个方法实现了 函数式接口定义的方法。也就是说,lambda表达式会产生一个匿名类,它是函数式接口的实现类。因此lambda表达式也常被称为“闭包”。
4、 lambda操作符:-> ,其左侧指定lambda表达式需要的所有参数(无参数则使用空的参数列表),右侧指定lambda体。
5、Java定义了两种lambda体,一种包含一个单独的表达式,一种包含一个代码块。
6、当接口引用上下文中出现lambda表达式时,会自动创建函数式接口的一个实现类,接口抽象方法的具体实现由lambda表达式定义。当通过接口引用调用该方法时,就会执行lambda表达式。lambda表达式提供了一种将代码片段转换为对象的方法。
7、lambda表达式的参数的类型和数量必须与函数式接口定义的方法的参数兼容;返回类型也必须兼容;并且lambda表达式可能跑出的异常必须能被方法接受。
8、函数式接口引用可以用来执行任何与其兼容的lambda表达式。

三、lambda表达式示例
示例一:
1、函数式接口(无参数)
interface MyNumber {
double getValue(); //方法无参数,返回类型是double
}
2、lambda表达式
() -> 123.45
它实际上是getValue()方法的的具体实现,等效于:
double getValue(){
return 123.45;
}
3、调用lambda表达式
public static void main(String[] args) {
MyNumber myNum = () -> 123.45; //myNum是函数式接口的引用
myNum.getValue(); //通过函数式接口引用来调用执行方法

myNum = () -> 3.14; //函数式接口引用可以执行多个兼容的lambda表达式
myNum.getValue();
}

示例二:
1、函数式接口(有一个参数)
interface Numeric {
boolean judge(int n);
}
2、使用lambda表达式
Numeric num = (n) -> n % 2 == 0; //参数 n,方法体是 return n%2==0;
num.judge(5);
只有一个参数时,可以省略括号。多个参数时,必须加括号。
Numeric num = n -> n % 2 == 0;
num.judge(5);
注意:这里的lambda表达式没有指定参数 n 的类型,n的类型是从上下文推断出来的。
当然, 在lambda表达式中可以显示的指定参数的类型。
Numeric num = (int n) -> n % 2 == 0;
num.judge(5);

示例三:
1、函数式接口(有多个参数)
interface Numeric2 {
boolean judge(int m, int n);
}
2、lambda表达式
Numeric2 num2 = (m, n) -> (m % n) == 0;
num2.judge(10, 5);
注意:显示指定参数类型时,必须每个参数都指定类型。
Numeric2 num2 = (int m, int n) -> (m % n) == 0; //正确
Numeric2 num2 = (int m, n) -> (m % n) == 0; //错误

四、块lambda表达式
1、lambda操作符右侧的代码可以由一个代码块组成,代码块中可以包含多条语句,如声明变量、if语句、循环语句、lambda表达式语句、return语句等等。
2、创建,只需要一对花括号即可, (...)->{... };

示例一:
1、函数式接口
interface Func{
int func(int n); //阶乘
}
2、lambda块
Func fc = n -> {
int res = 1;
for(int i = 1; i <= n; i++){
res *= i;
}
return res;
};
fc.func(5); //调用

示例2:
1、函数式接口
interface StrRev{
String reverse(String str); //字符串反转
}
2、lambda块
StrRev sr = str -> {
String s = "";
for(int i=str.length()-1;i>=0;i--){
s += str.charAt(i);
}
return s;
};
sr.reverse("abcd");
因为,根据上下文可以推断出str是String类型,所以lambda表达式内部可以调用String类型的方法。















### Lambda表达式的使用方法和示例 Lambda 表达式是一种简洁的语法形式,用于定义匿名函数或委托。它能够以非常紧凑的方式表示一段可执行逻辑,并且在多种编程语言中得到了广泛应用,例如 Java、C# 和 C++。 #### 基本语法与用法 Lambda 表达式的基本结构通常包括参数列表、箭头符号 `->` 或 `=>` 以及函数体。以下是一些典型的 Lambda 表达式示例: ```java // 无参Lambda表达式 Runnable runnable = () -> { System.out.println("Hello, World!"); }; ``` ```java // 有参Lambda表达式 Function<Integer, String> function = (num) -> "数字是:" + num; ``` ```java // 单行Lambda表达式 Predicate<String> predicate = (s) -> s.length() > 5; ``` 这些示例展示了如何通过 Lambda 表达式简化代码逻辑,使其更加直观和易于维护[^2]。 #### 在实际场景中的应用 Lambda 表达式的一个常见用途是作为参数传递给需要函数式接口的方法,例如在集合操作中进行过滤或映射: ```java public class Demo01Lambda { public static void method(int num, Calcable lambda) { System.out.println(lambda.cal(num)); } public static void main(String[] args) { method(-1314, n -> Math.abs(n)); // 使用Lambda表达式计算绝对值 [^1] } } ``` 在此示例中,Lambda 表达式 `n -> Math.abs(n)` 被用来替代一个单独定义的方法,从而减少了冗余代码并提高了可读性。 #### 与委托结合使用(C#) 在 C# 中,Lambda 表达式可以用来快速定义委托,而无需显式声明方法: ```csharp Func<int, int> square2 = x => x * x; // 使用Lambda表达式定义平方函数 Console.WriteLine(square2(5)); // 输出结果为25 [^3] ``` 这种写法不仅简化了代码结构,还使得逻辑意图更为清晰。 #### 方法引用与参数匹配 当 Lambda 表达式仅调用某个已存在的方法时,可以直接使用方法引用来进一步简化代码: ```java Function<String, Integer> func = String::length; // 正确:将字符串长度方法作为函数引用 ``` 此处的 `String::length` 是对 `String` 类中 `length()` 方法的一种直接引用,它等价于 `(s) -> s.length()`。这种方法引用方式要求被引用方法的参数列表必须与目标函数式接口的抽象方法参数相匹配[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值