问题描述
下面如何打印为 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)
斯凯蒂:https://scastie.scala-lang.org/UbCy36hHS3iVLKEdqzqUCw
,只是为了补充@IvanKurchenko 的精彩回答。如果 .max
中没有元素,List
可能会抛出异常。例如:
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
。