You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scala 2.11下java.sql.Timestamp使用sortWith与sortBy编译异常问题

问题1:Scala 2.11中sortBy按Timestamp排序报无隐式Ordering的错误

Scala 2.11标准库没有对java.sql.Timestamp做内置的Ordering隐式适配,仅2.13及以上版本才支持对所有实现了Comparable<T>的Java类型自动推导Ordering实例,这就是你在2.13能正常运行、2.11报错的核心原因。

要解决该问题,有两种常用方案:

  • 方案1:在当前作用域声明Timestamp的隐式排序规则,后续所有针对Timestamp的排序都可以复用
implicit val timestampOrdering: Ordering[java.sql.Timestamp] = Ordering.fromLessThan(_ before _)
// 之后B行代码就可以正常编译
val records = iter.toArray.sortBy(r => r.event_time)
  • 方案2:直接给sortBy方法显式传入排序规则,不需要修改全局隐式
val records = iter.toArray.sortBy(r => r.event_time)(Ordering.fromLessThan[java.sql.Timestamp](_ before _))

两种方案都能利用Timestamp本身的compareTo逻辑,覆盖毫秒+纳秒的全量排序,不会出现A写法里毫秒相等时排序错误的问题。

问题2:部分sortWith的下划线写法编译失败

Scala的下划线占位符语法有明确限制:每个下划线对应外层函数的一个参数,且不能嵌套在其他方法的参数列表中。

你写的A语句_.event_time.getTime < _.event_time.getTime符合规则:两个下划线分别对应<运算符的左右两个操作数,属于最外层函数的参数位置,编译器会正确推导为双参数函数(a, b) => a.event_time.getTime < b.event_time.getTime。

而C、D语句的第二个下划线都嵌套在before、compareTo方法的参数列表里,编译器会把第二个下划线识别为一个独立的单参数匿名函数,而不是外层sortWith需要的第二个参数,因此会抛出参数类型缺失的错误。

除了你已经在用的case(a,b)写法,也可以直接显式声明参数解决:

// C的等价可编译写法
val records = iter.toArray.sortWith((a, b) => a.event_time.before(b.event_time))
// D的等价可编译写法
val records = iter.toArray.sortWith((a, b) => a.event_time.compareTo(b.event_time) < 0)

内容的提问来源于stack exchange,提问作者dlamblin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 14:06:07