更优雅的写if方式(list.nonEmpty)有些(list.max)其他没有?

时间:2013-12-09 22:25:52

标签: scala functional-programming

List.max根据某些排序返回列表中的“最大”元素...但如果列表为空,则会得到java.lang.UnsupportedOperationException: empty.max。我真的不喜欢用if语句或匹配或其他任何东西乱抛垃圾代码。我想要最大的headOption之类的东西,但我没有看到这样的方法。获得list.maxOption等效的最优雅方法是什么?

5 个答案:

答案 0 :(得分:13)

您可以将Try转换为选项:

Try(empty.max).toOption

您也可以使用reduceOption(如scala - Min/max with Option[T] for possibly empty Seq?中所述):

l.reduceOption(_ max _)

答案 1 :(得分:11)

或者自己写一下:

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

答案 2 :(得分:7)

以下是实现目标的一种方法:

Some(list).filter(_.nonEmpty).map(_.max)

答案 3 :(得分:2)

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

List(34, 11, 98, 56, 43).minOption // Option[Int] = Some(11)
List[Int]().minOption              // Option[Int] = None

答案 4 :(得分:0)

另一种表述是

list.headOption.map(_ => list.max)