for comprehension如何在比较时返回None ?



为什么下面的a被打印为None,而这里的最大值是3

val firstNum: Option[Int] = None
val secondNum: Option[Int] = Some(3)
val a = for {
f <- firstNum
s <- secondNum
} yield Math.max(f, s)
println(a)

输出
None

正如评论部分所提到的,您正在使用for-comprehension结构,它在底层调用flatMap方法,根据左恒等单律,None.flatmap(f) == None.

如果你想找到两个Option[Int]之间的最大值并忽略它们中的任何一个,请尝试:


val firstNum: Option[Int] = None
val secondNum: Option[Int] = Some(3)
​
println(List(firstNum, secondNum).flatten.max)

Scatie: https://scastie.scala-lang.org/UbCy36hHS3iVLKEdqzqUCw

再加上@IvanKurchenko的精彩回答。如果List中没有元素,.max可能会抛出异常。例如:

List[Option[Int]](None).flatten.max

将抛出异常:

java.lang.UnsupportedOperationException: empty.max

您可以使用maxOption:

List(Some(3), None).flatten.maxOption

将提供Some(3)

List[Option[Int]](None).flatten.max

将提供None.

最新更新