如何内联minBy结果

时间:2019-05-28 15:44:05

标签: scala

我有以下scala代码:

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);

但是又遇到另一个错误。

这可以写成一行吗?

1 个答案:

答案 0 :(得分:2)

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

{
    "user": {
        "userId": 1,
        "fullName": "Carolina Ponce",
        "roles":[]
    }
}

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

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方法,例如apply

List

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

有关隐式的更多信息:Understanding implicit in Scala