在scala中使用forall()从Option [String]中提取字符串[重复]

Posted

技术标签:

【中文标题】在scala中使用forall()从Option [String]中提取字符串[重复]【英文标题】:Using forall() in extracting String from Option[String] in scala [duplicate] 【发布时间】:2020-07-17 02:06:57 【问题描述】:

我不明白 forAll 何时处理 None 值。

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。

【问题讨论】:

如果您将 Some 视为具有单个元素的列表,而将 None 视为具有 0 个元素的列表(它们不是),这可能会有所帮助 BTW if (foo) true else false 是多余的,你可以直接返回 foo 这就是forall def 看起来像final def forall(p: A => Boolean): Boolean = isEmpty || p(this.get)。因此,如果它是空的并且这意味着 None 无论如何,它将返回 true,否则将测试谓词。从文档 ` /** 如果此选项为空,则返回 true '''或'''谓词` * $p returns true when applied to this $option's value. * * This is equivalent to: ` * option match ` ` * case Some(x) => p( x)`* case None => true`*`*/ 【参考方案1】:

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

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

【讨论】:

以上是关于在scala中使用forall()从Option [String]中提取字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

翻译/编码 Haskell 的 `data Obj = forall a. (显示 a)=> Scala 中的 Obj a`

以有效的方式从scala中的序列中过滤选项

scala-从入门到精通

如何在 scala 数组集合中使用文字参数?

FORALL 插入目标表,然后从源表中删除 FORALL

在 Scala 中将 Option[x] 转换为 x