使用forall()从scala中的选项[String]提取字符串

使用forall()从scala中的选项[String]提取字符串,scala,forall,Scala,Forall,我不明白forAll什么时候处理无价值的事情 def areTheyEqual(x: Option[String], y: String) = { if (x.forall(_ == y)) { true } else { false } } 当我调用函数时: areTheyEqual(None,“hello”)这返回true,而我认为这是false,因为它们不相等。请帮忙。为什么是这样 编辑: 为了解决这个问题,我将if语句更改为: i

我不明白forAll什么时候处理无价值的事情

def areTheyEqual(x: Option[String], y: String) = {
    if (x.forall(_ == y)) {
        true
    } else {
        false
    }
}
当我调用函数时:
areTheyEqual(None,“hello”)
这返回true,而我认为这是false,因为它们不相等。请帮忙。为什么是这样

编辑:

为了解决这个问题,我将if语句更改为:
if(x.nonEmpty&&x.forall(==y))

但是我仍然想知道为什么它在没有
x.nonEmpty
条件的情况下返回true。

一般来说,
forall
方法检查集合中的所有对象是否满足某个谓词。那么当它返回
false
时意味着什么呢?从逻辑上讲,它必须意味着集合中存在谓词不为true的元素。那么
None
是否包含谓词不为true的元素?显然不是,因为它根本不包含任何元素。因此,在这种情况下,
forall
返回
false
是错误的。所以这一切都是有道理的


另一方面,如果
选项
为空,则
exists
方法将返回
false

如果您认为Some是一个包含单个元素的列表,而None是一个包含0个元素的列表(它们不是),那么如果(foo)true else false是多余的,那么这可能会有帮助,您只需返回
foo
。这就是
forall
def看起来的
final def forall(p:A=>Boolean):Boolean=isEmpty | p(This.get)
。因此,如果它是空的,这意味着一个None,那么它将返回true,否则将测试谓词。在文档中,`/**如果此选项为空或“”,则返回true。谓词`
*$p在应用于此$option的值时返回true。
**这相当于:`*选项匹配{```*case Some(x)=>p(x)`
*case None=>true
`*}`
*/