Java、Kotlin、Python的Lambda表达式

2022-04-28  本文已影响0人  景知育德

前言

什么是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

应用

自定义排序

按字符串中字母“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中其实还有更为丰富的语法。此处不表。

上一篇下一篇

猜你喜欢

热点阅读