首页 > 解决方案 > 如何内联 minBy 结果

问题描述

我有以下斯卡拉代码:

val test = rows.groupBy(l => l(8))
val m = test.reduce((a, b) => if (a._2.size > b._2.size) a else b)
val mina = m._2.minBy(x => x(0));
val minv = mina(0);

我想写

val minv = m._2.minBy(x => x(0))(0);

但我得到一个编译器错误

[error] D:\dev\local\spark\httpLogs\src\main\scala\Main.scala:35:38: type mismatch;
[error]  found   : Int(0)
[error]  required: Ordering[String]
[error]                                 val minv = m._2.minBy(x => x(0))(0);
[error]                                                                  ^

我也试试

val minv = (m._2.minBy(x => x(0)))(0);

但只是得到另一个错误。

这可以写成一行吗?

标签: scala

解决方案


Scala 隐式参数很简洁,但如果您不了解它们,它们就会令人困惑。

val mina = m._2.minBy(x => x(0))

实际上是(通过隐式解析解决)

val mina = m._2.minBy(x => x(0))(Ordering.String)

所以当你打电话时

val minv = m._2.minBy(x => x(0))(0)

实际上,您将0作为显式参数传递给隐式。

通过将结果分配给变量,您可以让编译器插入隐式参数。如果您直接调用它,则柯里化函数参数(隐式是显式函数之后的柯里化参数)和apply碰撞的语法糖。编译器会选择 curried 函数参数。

如果您有一个带有apply方法的对象,例如List

val list = List(1, 2, 3)

它会将其重写为List.apply(1, 2, 3). 这就是为什么apply在上面的示例中起作用的原因,因为它告诉编译器显式使用apply,而不是依赖于被 curried 函数覆盖的语法糖。

更多关于隐式:理解 Scala 中的隐式


推荐阅读