为什么下面的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
.