我有以下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);
但是又遇到另一个错误。
这可以写成一行吗?
答案 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