0

这段代码工作正常并按预期返回 343423:

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

但它不适用于 Some[Long]:

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

错误:没有为 Some[Long] 定义隐式排序。
val maxSomeLong = longSomeList.max

有没有简单的解决方案来获得第二个列表的最大值?

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

4

4 回答 4

2

在哪个现实世界场景中,你会有一个ListBuffer[Some[Long]]?你也可以有一个ListBuffer[Long]then。

这有效:

val longSomeList: ListBuffer[Option[Long]] = ListBuffer(Some(103948),Some(343423),Some(209754))
val maxSomeLong = longSomeList.max
于 2017-12-31T14:48:27.763 回答
1
longSomeList.collect { case Some(n) => n }.max
于 2017-12-31T14:37:57.153 回答
1

您正在寻找.flatten.

 longSomeList.flatten.max

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

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

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

于 2017-12-31T14:44:27.120 回答
1

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

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)
于 2017-12-31T15:13:24.833 回答