more elegant way to write if( list.nonEmpty) Some(list.max) else None?

9.3k views Asked by At

List.max returns the "largest" element of a list based on some ordering... But if the list is empty you'll get a java.lang.UnsupportedOperationException: empty.max exception. I don't really like littering code with if statements or matches or whatever. I want something like headOption for max, but I'm not seeing such a method. What's the most elegant way to get the equivalent of list.maxOption?

5

There are 5 answers

2
Rob Napier On BEST ANSWER

You can convert a Try into an Option:

Try(empty.max).toOption

You can also use reduceOption (as given in scala - Min/max with Option[T] for possibly empty Seq?):

l.reduceOption(_ max _)
0
thoredge On

Here is one way to accomplish it:

Some(list).filter(_.nonEmpty).map(_.max)
3
dhg On

Or write your own:

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
0
Xavier Guihot On

Starting in Scala 2.13, minOption/maxOption are now part of the standard library:

List(34, 11, 98, 56, 43).maxOption // Option[Int] = Some(98)
List[Int]().maxOption              // Option[Int] = None
1
Tim On

Another formulation would be

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