scala - 如何内联 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 隐式参数很简洁,但如果您不了解它们,它们就会令人困惑。
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 中的隐式
推荐阅读
- mongodb - 在 mongo 中更改数据类型和更新值
- angular - Angular 6以反应形式动态创建单选按钮和复选框
- oracle - DECS 活动不会开始
- python - keras / tensorflow层的“形状”和权重何时何地确定和存储?
- r - 在更改 y 范围后标记堆积条形图(使用 ggplot 制作)
- r - 两组观测值之间的马氏距离
- r - 为“bupaR”准备事件日志的循环方法:这可以向量化吗?
- swift - Swift 单例与静态属性/方法
- javascript - 验证弹出窗口中的电话 10 位号码,如果小于 10 则阻止提交
- python-3.x - 预期输出 python3.x 未返回总排序