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