这段代码工作正常,并按预期返回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
错误:没有为某些[Long]定义隐式排序。 val maxSomeLong = longSomeList.max
是否有任何简单的解决方案来获得第二个列表的最大值?
TraversableForwarder的最大函数(scala.collection.generic)
您正在寻找.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
longSomeList.collect { case Some(n) => n }.max
问题是你正在尝试订购Some[Long]
类型的元素,这是未定义的。所以你告诉编译器知道如何订购它们:
scala> Some(1) < Some(2)
<console>:8: error: value < is not a member of Some[Int]
Some(1) < Some(2)
^
你可以做的是打开Some
s以获得Long
s
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)