Scala - identity() 函数

最近在写 Spark 作业的时候,使用到了 groupBysortBy,在查找文档的时候,发现有的文档中的代码有着groupBy(identity)这样奇怪的写法。

在 Scala 文档中,identity 函数的作用就是将传入的参数“直接”当做返回值回传给调用者,这在正常使用中,可以说是毫无作用,但他在groupBysortBy等函数中的作用,在于避免程序员书写相同且容易出错的逻辑,原因如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 前提条件:
val array = Array(9,2,1,3,1,5,9,4,6,7,2)

// 统计 array 中每个元素出现的次数
// 正常逻辑:
array.groupBy(n => n)
// scala.collection.immutable.Map[Int,Array[Int]] = Map(5 -> Array(5), 1 -> Array(1, 1), 6 -> Array(6), 9 -> Array(9, 9), 2 -> Array(2, 2), 7 -> Array(7), 3 -> Array(3), 4 -> Array(4))

// 使用 identity
array.groupBy(identity)

// 将 array 进行排序(升序)
// 正常逻辑:
array.sortBy(n => n)
// Array[Int] = Array(1, 1, 2, 2, 3, 4, 5, 6, 7, 9, 9)

// 使用 identity 或者简化版本
array.sortBy(identity)
array.sorted