Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala是否有库方法来构建考虑空字符串的Option-s?_Scala - Fatal编程技术网

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。@mkneisll
null
在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
,这将失败,不是吗?