Scala是否有库方法来构建考虑空字符串的Option-s?
我想过滤掉空字符串,将它们放入一个选项中。所以我现在很快建立了这个:Scala是否有库方法来构建考虑空字符串的Option-s?,scala,Scala,我想过滤掉空字符串,将它们放入一个选项中。所以我现在很快建立了这个: def StrictOption(s: String) = s match { case s if s != null && s.trim.length() > 0 => Some(s) case _ => None } 问题:这可能已经存在于标准库中了吗?我认为标准库中没有一种方法可以做到这一点,但您可以比您的实现更简洁地做到这一点 Option(s).filter(_.trim.
def StrictOption(s: String) = s match {
case s if s != null && s.trim.length() > 0 => Some(s)
case _ => None
}
问题:这可能已经存在于标准库中了吗?我认为标准库中没有一种方法可以做到这一点,但您可以比您的实现更简洁地做到这一点
Option(s).filter(_.trim.nonEmpty)
如果你真的在乎表现,那么
if (s.trim.isEmpty) None else Some(s)
仅比Ben James的解决方案长4个字符,在我的基准测试中(47对141),运行速度快3倍。没有内置任何东西;如果性能不是问题(例如,您正在验证用户输入),Ben的过滤器是最好的简短版本。通常,性能不会成为问题 另外,请注意,当您没有实际匹配任何内容时,使用
match
有点奇怪;这只是得到if-else语句的更多样板。就说
if (s ne null && s.trim.length > 0) Some(s) else None
除非你想写你自己的IsIt空白方法,否则它几乎和任何东西一样快速和简洁。请注意,trim
使用了一个特殊的标准:高于\u0020(即“')的任何内容都不会被修剪,而等于或低于的任何内容都会被修剪。因此,如果此操作的性能特别重要,您也可以编写自己的修剪字符串为空检测器:
def ContentOption(s: String): Option[String] = {
if (s ne null) {
var i = s.length-1
while (i >= 0) {
if (s.charAt(i) > ' ') return Some(s)
i -= 1
}
}
None
}
期权(“某物”)产生一些(“某物”)
选项(null)不产生任何结果这也可以通过一个用于理解的
val res = for (v <- Option(s) if s.nonEmpty) yield v
val res=for(v启动Scala 2.13
,适用于那些不期望null
s(非Java上下文)的用户,现在是一个可选选项:
// val str = "hello"
Option.unless(str.isEmpty)(str)
// Option[String] = Some(hello)
Option.when(str.nonEmpty)(str)
// Option[String] = Some(hello)
// val str: String = ""
Option.unless(str.isEmpty)(str)
// Option[String] = None
Option.when(str.nonEmpty)(str)
// Option[String] = None
这会导致s==null的NullPointerException。@mkneisllnull
在Scala中不需要考虑,但如果是,您可以将其更改为if(s==null | | s.trim.isEmpty)运行时是完全一样的。看问题,OP对OP似乎是重要的。否则我99%同意。不幸的是在Skad DATAFFrAMS中,<代码> null <代码>是一个你必须考虑的值。它也是很多java互操作中要考虑的问题。我甚至会使用<代码>选项(s)。map((.Trim.)。过滤器(非空)”
Option(s.trim.nonEmpty)
@RomanKazanovskyi,如果s
来自java世界,可能是null
是的,那么更好的选项。Option(s.trim.nonEmpty)
@RomanKazanovskyi,确保答案是安全的。我指的是你的变体:选项(s.trim)
如果s
为null
,这将失败,不是吗?