比较如何理解返回 None?
How is for comprehension returning None on comparison?
下方如何打印为 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
方法,根据左恒等式 monad 法则总是这样工作:None.flatmap(f) == None
.
如果您想在两个 Option[Int]
之间找到最大值并忽略其中任何一个,请尝试:
val firstNum: Option[Int] = None
val secondNum: Option[Int] = Some(3)
println(List(firstNum, secondNum).flatten.max)
只是为了补充@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
。
下方如何打印为 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
方法,根据左恒等式 monad 法则总是这样工作:None.flatmap(f) == None
.
如果您想在两个 Option[Int]
之间找到最大值并忽略其中任何一个,请尝试:
val firstNum: Option[Int] = None
val secondNum: Option[Int] = Some(3)
println(List(firstNum, secondNum).flatten.max)
只是为了补充@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
。