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

时间:2012-03-05 15:18:13

标签: scala

我想定义一个函数:

def convert(x: Option[String]): Option[String] = ...

xSome(str)且修剪后str为空时,它将转换为无,否则,它将是带有修剪字符串的Some

因此,测试用例将是:

convert(Some("")) == None
convert(Some("  ")) == None
convert(None) == None
convert(Some(" abc ")) == Some("abc")

我可以把它写成:

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

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

3 个答案:

答案 0 :(得分:15)

这个怎么样:

def convert(x: Option[String]) = 
    x.map(_.trim()).filterNot(_.isEmpty())

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

x map {_.trim} filterNot {_.isEmpty}
x map (_.trim) filterNot (_.isEmpty)

答案 1 :(得分:1)

和往常一样,还有for comprehension替代语法(这是过滤器和地图的语法糖)

 def convert(o: Option[String]): Option[String] = 
    for (x <- o if !x.isEmpty) yield x

答案 2 :(得分:1)

def convert(x:Option [String])= x.filter(s =&gt; s.trim.nonEmpty)