在 Scala 的 Some[Long] 的 ListBuffer 中获取最大值

Get max in a ListBuffer of Some[Long] in Scala

这段代码工作正常,returns 343423 符合预期:

val longList: ListBuffer[Long] = ListBuffer(103948,343423,209754)
val maxLong = longList.max

但对某些人无效[Long]:

val longSomeList: ListBuffer[Some[Long]] = ListBuffer(Some(103948),Some(343423),Some(209754))
val maxSomeLong = longSomeList.max

Error: No implicit Ordering defined for Some[Long].
val maxSomeLong = longSomeList.max

是否有任何简单的解决方案来获取第二个列表的最大值?

来自 TraversableForwarder 的最大函数(scala.collection.generic)

longSomeList.collect { case Some(n) => n }.max

您正在寻找 .flatten

 longSomeList.flatten.max

或者给它明确的使用顺序:

 longSomeList
   .max(Ordering.by[Option[Int], Int](_.getOrElse(Int.MinValue)))

另外,不要使用可变集合。

您会在哪种现实世界场景中使用 ListBuffer[Some[Long]]?那你也可以有一个ListBuffer[Long]

这个有效:

val longSomeList: ListBuffer[Option[Long]] = ListBuffer(Some(103948),Some(343423),Some(209754))
val maxSomeLong = longSomeList.max

问题是您正在尝试对未定义的 Some[Long] 类型的元素进行排序。所以你告诉编译器知道如何订购这些:

scala> Some(1) < Some(2)
<console>:8: error: value < is not a member of Some[Int]
              Some(1) < Some(2)
                      ^

你可以做的是打开 Somes 得到 Longs

longSomeList.flatten.max

或以同样的方式定义您的隐式排序:

implicit object Ord extends Ordering[Some[Long]] {
  def compare(a: Some[Long], b: Some[Long]) = a.getOrElse(Long.MinValue) compare b.getOrElse(Long.MinValue)
}

然后:

scala> longSomeList.max
res12: Some[Long] = Some(343423)