Scala使用Option类型Timestamp作为sortBy降序键时的报错求解
解决方案
错误原因说明
- 第一种写法错误:你直接对
Option[Timestamp]类型调用.seconds,Option包装类本身没有该属性,必须先解包才能访问Timestamp的字段 - 第二种写法错误:
x.map(_.seconds)得到的是Option[Long]类型,Scala没有为Option默认实现compareTo方法,因此无法直接调用
可行实现方式
实现1:利用Scala自带的Option排序规则(最简洁)
Scala标准库已经提供了Option类型的默认排序实现,无需手动写比较逻辑:
import com.google.protobuf.timestamp.Timestamp // 先定义Timestamp的排序规则,按秒数升序排列 implicit val timestampOrdering: Ordering[Timestamp] = Ordering.by(_.seconds) // 调用sortBy时指定使用Option的排序规则并反转,实现registeredAt降序 // 默认规则下None < 所有Some值,反转后有值的记录排在最前,无注册时间的排在末尾 val sortedRegistrations = registrations.sortBy(_.registeredAt)(Ordering.Option[Timestamp].reverse)
实现2:自定义Ordering(适配自定义None排序需求)
如果你需要调整无注册时间(None)的排列位置,可以手动实现比较逻辑:
import com.google.protobuf.timestamp.Timestamp implicit val optionTimestampOrdering: Ordering[Option[Timestamp]] = new Ordering[Option[Timestamp]] { override def compare(x: Option[Timestamp], y: Option[Timestamp]): Int = (x, y) match { case (None, None) => 0 // 两个都是None则相等 case (None, _) => 1 // None排在有值的后面,要改排在前面就返回-1 case (_, None) => -1 // 有值的排在None前面 case (Some(t1), Some(t2)) => t1.seconds.compareTo(t2.seconds) // 都有值按秒数升序 } } // 反转排序实现降序 val sortedRegistrations = registrations.sortBy(_.registeredAt)(optionTimestampOrdering.reverse)
内容的提问来源于stack exchange,提问作者Dejell
相关产品推荐
相关产品推荐

