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())
正如评论中所建议的,您可以通过不依赖if
s 来表达简单的布尔条件来进一步提高可读性。
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 程序中的三元运算符使用 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章