Scala 程序中的三元运算符用法

Ternary operator usage in Scala program

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

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

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

任何人都可以帮助我如何在 scala 的过滤器函数中编写这个三元运算符。

我同意我可以编写一个自定义函数来处理 @ 中提到的这个问题 但是,我感兴趣的是为什么这条语句会出现编译错误。 因为,这是 Java.

中的有效语句

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

在Java中if语句和三元运算符之间的主要区别在于后者是一个表达式,这意味着它被计算为结果,虽然 if 是(正如我之前建议的那样)一个依赖 side-effects 在其范围内使事情发生的声明。

在 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(具有 O(n) List) 上的复杂性可以为您节省一些周期:

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

您似乎也在尝试对两个字符串进行 case-insensive 相等性检查,在这种情况下,您可能有兴趣使用 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)