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

Man*_*rdt 34 scala

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

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

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

Ben*_*mes 102

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

Option(s).filter(_.trim.nonEmpty)
Run Code Online (Sandbox Code Playgroud)


Lui*_*hys 7

如果你关心性能那么

if (s.trim.isEmpty) None else Some(s)
Run Code Online (Sandbox Code Playgroud)

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

  • 这会导致s == null的NullPointerException. (4认同)
  • @mkneissl`null`在Scala中不需要考虑,但是如果是,您可以将其更改为`if(s == null || s.trim.isEmpty)`。运行时间完全相同。 (2认同)

Xav*_*hot 6

开始Scala 2.13,对于那些没有料到nullS(非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
Run Code Online (Sandbox Code Playgroud)


Rex*_*err 5

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

另外,请注意,match当你没有真正匹配任何东西时使用它会有点奇怪; 获得if-else语句只是更多样板.说啊

if (s ne null && s.trim.length > 0) Some(s) else None
Run Code Online (Sandbox Code Playgroud)

除非你想编写自己的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
}
Run Code Online (Sandbox Code Playgroud)