前言
什么是Lambda表达式呢?Lambda表达式可以看成一种轻量级的函数,声明一个Lambda表达式比声明一个函数更言简意赅。不同语言对Lambda表达式的定义其实有所区别,这里不去做理论层面的深入比较。Lambda表达式不需要函数名,因此是一种匿名函数。
语法
Java
Java 1.8 中引入了Lambda表达式。用->
来隔开参数与计算部分。如果参数有多个,需要用圆括号。如果计算部分有多行,那么就需要花括号。
Java中声明函数是一定需要说明参数类型的。但是Lambda表达式并不需要。
例:
// 1. 不需要参数,返回值为 5
() -> 5
// 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)
Kotlin
Kotlin是另外一款JVM语言。Kotlin在设计时就考虑到了“函数式编程”(把函数当做参数、返回值等)。Lambda表达式在Kotlin中更常用。
Kotlin中的Lambda表达式一定是花括号括起来的。需要用花括号括住整个Lambda表达式。和Java一样,用->
来隔开参数与计算部分。
例
{ x: Int, y: Int -> x + y }
Kotlin在Lambda表达式等领域,比Java更为方便,可以将整个Lambda表达式看做一个对象,然后赋值给一个变量。Kotlin更易于函数式编程。
例子
// 一般情况下是这样的
val sum = { x: Int, y: Int -> x + y }
println(sum(5, 10)) // 输出15
// 这样也可以
println({ x: Int, y: Int -> x + y }(5, 10)) // 输出15
Python
Python同样支持函数式编程,因此Lambda表达式比较重要。在Python中,Lambda表达式必须写lambda
的字样。并且,参数和计算部分是:
隔开(而不是->
)。
例:
lambda x, y: x + y
对比
语言 | 分隔 | 参数类型 | 示例 |
---|---|---|---|
Java | -> |
可以省略 | (x, y) -> x + y |
Kotlin | -> |
如果能类型推断则可以省略 | { x: Int, y: Int -> x + y } |
Python | : |
省略,但可以注明 | lambda x, y: x + y |
- Kotlin 的一定需要花括号
- Python 的一定需要写
lambda
应用
自定义排序
按字符串中字母“A”的数量从小到大排序。
Java
在Java中,Arrays.sort()
可以填写参数。但是Java比较麻烦,因为有int[]
和Integer[]
的区别。故而,使用String[]
的排序作为例子。
假定我们已经编好了count()
函数,可以计算一个String中字母A的数量。(本文的代码部分不展示)
Arrays.sort(strings, (o1, o2) -> count(o1) - count(o2));
// 如果不使用Lambda表达式,就很长了
Arrays.sort(strings, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return count(o1) - count(o2);
}
});
Kotlin
strings.sortWith { o1: String, o2: String -> count(o1) - count(o2) }
(注意,Kotlin里的sort()
不能带有参数,sortWith()
可以带有参数,它们都是在原地进行排序。而sorted()
和sortedWith()
是返回一个排序好的新数组。)
Python
Python自定义排序使用key
参数的话,则不是比较,而是计算一个键值。
strings.sort(key=lambda o: count(o))
筛选
在Kotlin中,可以使用筛选功能。
// 筛选出含有字母a的
println(strings.filter { o-> 'a' in o.lowercase() })
结语
事实上,在函数式编程的高阶函数中,常常使用Lambda表达式。在Kotlin中其实还有更为丰富的语法。此处不表。
网友评论