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

nai*_*rbv 10 functional-programming scala

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

Rob*_*ier 13

您可以将Try转换为选项:

Try(empty.max).toOption
Run Code Online (Sandbox Code Playgroud)

你也可以使用reduceOption(在scala中给出- 最小/最大,选项[T]可能是空的Seq?):

l.reduceOption(_ max _)
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个选项非常优雅,但就性能而言,"if"比打开`try`块便宜得多,并且可能会产生堆栈跟踪异常.如果您了解perf,请选择其中一个选项. (4认同)

dhg*_*dhg 12

或者自己写:

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
Run Code Online (Sandbox Code Playgroud)


Xav*_*hot 9

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

List(34, 11, 98, 56, 43).maxOption // Option[Int] = Some(98)
List[Int]().maxOption              // Option[Int] = None
Run Code Online (Sandbox Code Playgroud)


tho*_*dge 7

这是实现它的一种方法:

Some(list).filter(_.nonEmpty).map(_.max)
Run Code Online (Sandbox Code Playgroud)