Как преобразовать некоторые ("") в None в одну строку?

Я хочу определить функцию:

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

Если x - Some(str), а после timming - str, он будет преобразован в значение None, в противном случае это будет 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
}

Но я надеюсь найти более простую реализацию (однострочную).

Ответ 1

Как насчет этого:

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

UPDATE: альтернативные синтаксисы, предложенные @JamesMoore и @PeterSchmitz:

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

Ответ 2

И, как обычно, существует и альтернативный синтаксис для понимания (который представляет собой синтаксический сахар для фильтра и карты)

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

Ответ 3

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