Scala 程序中的三元运算符使用 [关闭]

Posted

技术标签:

【中文标题】Scala 程序中的三元运算符使用 [关闭]【英文标题】:Ternary operator usage in Scala program [closed] 【发布时间】:2017-07-02 16:31:06 【问题描述】:

我有一个需要应用过滤器的对象数组。

val filteredList = list.filter l =>  (pid == "") ? true : l.ProviderId.toUpperCase().contains(pid.toUpperCase()))

Scala 编译器未编译此代码。我收到类似的错误 1)价值?不是布尔值的成员 2) 类型 toUpperCase 不是字符串的成员。

谁能帮我在scala的过滤器函数中编写这个三元运算符。

我同意我可以编写一个自定义函数来处理@Ternary Operators in Scala 中提到的这个问题 但是,我对为什么此语句存在编译错误感兴趣。 因为,这是 Java 中的有效语句。

【问题讨论】:

什么是pid?你的意思是l == "" 不是您问题的直接答案,但if (pid == "") true 是多余的。你可以把这个表达式写成pid == "" || l.ProviderId.toUpperCase().contains(pid.toUpperCase()) Ternary Operators in Scala的可能重复 pid 是我从 UI 传递的一个搜索参数,我需要根据它过滤掉列表。 ||运营商是一个很好的解决方案。但我很感兴趣,为什么 scala 中的这个语句会出现编译错误。不幸的是,这个问题已经有很多人不喜欢了。 出现错误,因为 Scala 中不存在该语法。正如另一个问题的答案中所解释的,if-else 是 Scala 中的表达式,因此不需要它。 【参考方案1】:

主要问题是 Scala 不支持您描述的三元运算符。 Java 支持它,但 Scala 不需要它。

在 Java 中,if 语句 和三元运算符之间的主要区别在于后者是一个表达式,这意味着它被评估为一个结果,而 if 是(正如我之前建议)一个依赖于其范围内的副作用来使事情发生的语句。

在 Scala 中,if 已经是一个表达式,因此不需要三元运算符。

您的代码结构如下:

val filteredList = list.filter  l => if (pid == "") true else l.ProviderId.toUpperCase().contains(pid.toUpperCase()) 

正如评论中所建议的,您可以通过不依赖ifs 来表达简单的布尔条件来进一步提高可读性。

val filteredList = list.filter  l => pid == "" || l.ProviderId.toUpperCase().contains(pid.toUpperCase())) 

此外,在您的情况下,pid 似乎在列表本身之外,因此可能会将其从 filter 中拉出来(在 List 上具有 O(n) 复杂性) 可以为您节省一些周期:

val filteredList = if (pid.isEmpty) list else list.filter(_.ProviderId.toUpperCase().contains(pid.toUpperCase()))

您似乎还试图对两个字符串进行不区分大小写的相等性检查,在这种情况下,您可能有兴趣使用Pattern,而不是在每个循环中将pid 转换为大写:

val pidPattern = Pattern.compile(Pattern.quote(pid), Pattern.CASE_INSENSITIVE)

val filteredList = if (pid.isEmpty) list else list.filter(l => pidPattern.matcher(l.ProviderId).find)

【讨论】:

感谢 stefanobaghino 指出最佳实践和正确编码的方法。

以上是关于Scala 程序中的三元运算符使用 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

您对三元运算符使用哪种编码风格? [关闭]

奇怪的行为三元运算符[关闭]

为啥 Go 没有三元条件运算符 [关闭]

创建一个包含三元组的 PriorityQueue,并返回 Scala 中的最小第三个元素?

为啥 Kotlin 不支持“三元运算符”[关闭]

C# 中哪个三元运算符最流行和最常用? [关闭]