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()) }
如评论中所建议,您可以通过不依赖 if
s 来表达简单的布尔条件来进一步提高可读性。
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)
我有一个对象数组需要应用过滤器。
val filteredList = list.filter{ l => (pid == "") ? true : l.ProviderId.toUpperCase().contains(pid.toUpperCase()))}
Scala 编译器无法编译此代码。我收到类似的错误 1)价值?不是布尔值的成员 2) toUpperCase 类型不是字符串的成员。
任何人都可以帮助我如何在 scala 的过滤器函数中编写这个三元运算符。
我同意我可以编写一个自定义函数来处理 @
主要问题是 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()) }
如评论中所建议,您可以通过不依赖 if
s 来表达简单的布尔条件来进一步提高可读性。
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)