Scala是否有一个库方法来构建考虑空字符串的Option-s?

时间:2011-12-16 12:30:45

标签: scala

我想过滤掉空字符串以将它们放入Option中。所以我现在很快建立了这个:

def StrictOption(s: String) = s match {
  case s if s != null && s.trim.length() > 0 => Some(s)
  case _ => None
}

问题:这可能已经存在于标准库中吗?

6 个答案:

答案 0 :(得分:98)

我不认为标准库中有一个单一方法可以做到这一点,但是你可以比你的实现更加简洁。

Option(s).filter(_.trim.nonEmpty)

答案 1 :(得分:7)

如果您完全关心表现,那么

if (s.trim.isEmpty) None else Some(s)

只比Ben James的解决方案长4个字符,在我的基准测试中运行速度提高3倍(47 vs 141)。

答案 2 :(得分:5)

没有内置任何东西;如果性能不是问题(例如,您正在验证用户输入),Ben的过滤器是最好的简要版本。通常,性能不会成为问题。

另外,请注意,如果您没有真正匹配任何内容,使用match会有点奇怪;获得if-else语句只是更多的样板。只是说

if (s ne null && s.trim.length > 0) Some(s) else None
除非你想编写自己的is-it-whitespace方法,否则

与任何事情一样快速和简短。请注意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
}

答案 3 :(得分:2)

Scala 2.13开始,对于那些不期望null(非Java上下文)的用户,Option::unlessOption::when现在是一个替代选择:

// 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

答案 4 :(得分:0)

这也可以通过理解来实现

val res = for (v <- Option(s) if s.nonEmpty) yield v

答案 5 :(得分:-2)

选项(&#34;某事&#34;)产生一些(&#34;某事&#34;)

Option(null)生成None