我想定义一个函数:
def convert(x: Option[String]): Option[String] = ...
当x
为Some(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
}
但我希望找到一个更简单的实现(单行)。
答案 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)