如何在一行中将Some("")转换为None?

Fre*_*ind 8 scala

我想定义一个函数:

def convert(x: Option[String]): Option[String] = ...
Run Code Online (Sandbox Code Playgroud)

xSome(str)str修剪后为空时,它将被转换为无,否则,它将是一个Some修剪过的字符串.

因此,测试用例将是:

convert(Some("")) == None
convert(Some("  ")) == None
convert(None) == None
convert(Some(" abc ")) == Some("abc")
Run Code Online (Sandbox Code Playgroud)

我可以写成:

def convert(x: Option[String]): Option[String] = x match {
  case Some(str) if str.trim()!="" => Some(str.trim())
  case _ => None
}
Run Code Online (Sandbox Code Playgroud)

但我希望找到一个更简单的实现(单行).

Tom*_*icz 16

那这个呢:

def convert(x: Option[String]) = 
    x.map(_.trim()).filterNot(_.isEmpty())
Run Code Online (Sandbox Code Playgroud)

更新:@JamesMoore@PeterSchmitz建议的替代语法:

x map {_.trim} filterNot {_.isEmpty}
x map (_.trim) filterNot (_.isEmpty)
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用圆形的parens而不是卷曲的parens,我觉得它更容易阅读:D`x map(_.trim)filterNot(_.isEmpty)` (6认同)
  • 我认为如果你删除parens更容易阅读:x map {\ _.trim} filterNot {\ _.isEmpty} (4认同)
  • 如果要将空时修剪后的字符串映射到"无",但实际上不修剪字符串,请使用以下变体:`x filterNot(_.trim.isEmpty)` (2认同)