Scala中函数调用后附加括号的名称及相关技术疑问
理解Scala中连续函数调用的括号
嘿,这个问题其实戳中了Scala里「函数作为一等公民」的核心特性,我来给你拆解清楚:
首先,你看到的bucketizers(idx)(filteredDataset(inputCol).cast(DoubleType))是连续的函数调用,后面那对括号的本质是:调用bucketizers(idx)返回的函数实例。
拆解细节:
bucketizers应该是一个数组(或序列),其中每个元素都是函数类型的值——也就是说,它存的不是数字、字符串这类普通数据,而是可以被执行的函数。bucketizers(idx)的作用是从这个数组里取出第idx个函数实例;- 后面紧跟的
(...)就是把filteredDataset(inputCol).cast(DoubleType)作为参数,调用刚才取出的那个函数。
举个简单的模拟例子:
// 定义一个存函数的数组,每个函数接收Double,返回对应的桶描述 val bucketizers = Array( (num: Double) => if (num < 10) "低数值桶" else "高数值桶", (num: Double) => if (num < 50) "中数值桶" else "极高数值桶" ) // 取出第一个函数,直接调用它 val result = bucketizers(0)(15.0) // 输出:"高数值桶"
关于术语:
这对括号本身就是函数调用括号,但它之所以能跟在bucketizers(idx)后面,是因为bucketizers(idx)返回的是一个可调用的函数值——这正是你之前查的「高阶函数」相关场景(高阶函数支持返回函数作为结果)。
额外补充:拆分写法
如果你觉得连续括号看着别扭,完全可以拆成两步,逻辑完全等价:
// 第一步:取出对应的函数 val targetBucketizer = bucketizers(idx) // 第二步:调用这个函数 val processedCol = targetBucketizer(filteredDataset(inputCol).cast(DoubleType))
内容的提问来源于stack exchange,提问作者Jill Clover
相关产品推荐
相关产品推荐

