Lambda表达式(Lambda expression)是一个匿名函数,它基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction)。Lambda表达式是程序设计中的一个重要概念,尤其在支持函数式编程的语言中,如Java 8及以上版本、Python等。以下是对Lambda表达式的详细解释:
一、基本概念
- 匿名性:Lambda表达式没有函数名,即它是一个没有名称的函数。
- 函数性:尽管没有名称,但Lambda表达式具有参数列表、函数主体、返回类型,以及可能抛出的异常列表,因此它本质上是一个函数。
- 传递性:Lambda表达式可以作为参数传递给方法或存储在变量中,这体现了其可传递性。
二、语法结构
Lambda表达式的语法结构通常包含三个部分:参数列表、箭头符号(->)和表达式体(或语句块)。
- 参数列表:指定Lambda函数接受的参数。参数可以有零到多个,用逗号隔开,放在小括号中。
- 箭头符号:箭头符号“->”用于分隔参数列表和表达式体。它表示将给定的参数映射到表达式体中进行计算。
- 表达式体:指定Lambda函数执行的代码块,可以是任何有效的表达式或语句块。如果表达式体只有一条语句,且该语句有返回值,则可以省略大括号和return关键字;否则,必须使用大括号将多条语句括起来,并显式使用return语句返回结果。
三、用途
Lambda表达式的主要用途是作为函数式接口的实例。函数式接口是只有一个抽象方法的接口,它可以被Lambda表达式实现。Java 8提供了许多内置的函数式接口,如Comparator
、Runnable
和Function
等。
四、示例
以下是一个简单的Lambda表达式示例:
List<String> list = Arrays.asList("apple", "banana", "orange");
list.forEach(item -> System.out.println(item));
在这个示例中,Lambda表达式item -> System.out.println(item)
被用作forEach
方法的参数。这个Lambda表达式没有参数类型(因为Java编译器可以从上下文推断出参数类型),它接受一个字符串参数item
,并打印出该字符串。
在力扣2023题连接后等于目标字符串的字符串对中题解中也使用到了λ表达式
public int numOfPairs2(String[] nums, String target) {
// 字符数组计数
Map<String,Integer> countMap = new HashMap<>();
for (String num : nums) {
// λ表达式如果旧的值与新的值相等则将旧的值加1
countMap.merge(num,1,(old,newValue)->old+1);
}
int ans =0;
// 分解字符串,获取字符串枚举方案
for (int i = 1; i < target.length(); i++) {
String left = target.substring(0,i);
String right = target.substring(i);
if(left.equals(right)){
// 想不清楚就模拟咯 握手问题
ans+= countMap.getOrDefault(left,0)*(countMap.getOrDefault(right,0)-1);
}else {//握手问题
ans+= countMap.getOrDefault(right,0)* countMap.getOrDefault(left,0);
}
}
return ans;
}
五、优点
Lambda表达式的优点包括:
- 简洁性:Lambda表达式可以用更少的代码表达相同的功能,使代码更加简洁易读。
- 功能性:它支持函数式编程风格,使得代码更加模块化、易于理解和维护。
- 灵活性:Lambda表达式可以作为参数传递给方法或存储在变量中,增加了代码的灵活性和可重用性。
"生命之树常青,唯因不断学习之泉源不竭。"
这句名言寓意着,生命的活力和成长源自于我们持续不断地学习和探索。它鼓励我们认识到,通过不断学习新知识、新技能,以及不断反思和提升自我,我们的生命才能如同常青的树木一样,保持勃勃生机和不断进步。学习不仅让我们在知识上更加丰富,也让我们在精神上更加充实,成为更好的自己。