14

List.max根据某些排序返回列表的“最大”元素......但如果列表为空,您将收到java.lang.UnsupportedOperationException: empty.max异常。我真的不喜欢用 if 语句或匹配或其他东西乱扔代码。我想要类似headOptionfor 的东西max,但我没有看到这样的方法。获得等价物的最优雅方法是list.maxOption什么?

4

5 回答 5

16

您可以将 Try 转换为 Option:

Try(empty.max).toOption

您还可以使用 reduceOption (如在scala - Min/max with Option[T] for possible empty Seq? 中给出的?):

l.reduceOption(_ max _)
于 2013-12-09T22:40:30.010 回答
14

或者自己写:

implicit class WithMaxOption[T: Ordering](self: Seq[T]) {
  def maxOption() = if(self.isEmpty) None else Some(self.max)
}

List(1,2,3).maxOption  // Some(3)
List[Int]().maxOption  // None
于 2013-12-09T23:45:46.227 回答
9

Scala 2.13, minOption/maxOption现在开始是标准库的一部分:

List(34, 11, 98, 56, 43).maxOption // Option[Int] = Some(98)
List[Int]().maxOption              // Option[Int] = None
于 2018-10-03T06:57:15.467 回答
8

这是实现它的一种方法:

Some(list).filter(_.nonEmpty).map(_.max)
于 2013-12-09T23:40:01.590 回答
1

另一种表述是

list.headOption.map(_ => list.max)
于 2017-11-21T18:24:10.240 回答