Как преобразовать Some ("") в None в одну строку? - PullRequest
8 голосов
/ 05 марта 2012

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

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

Когда x равно Some(str) и 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
}

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

Ответы [ 3 ]

15 голосов
/ 05 марта 2012

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

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

ОБНОВЛЕНИЕ: альтернативные синтаксисы, предложенные @ JamesMoore и @ PeterSchmitz :

x map {_.trim} filterNot {_.isEmpty}
x map (_.trim) filterNot (_.isEmpty)
1 голос
/ 11 мая 2016

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

1 голос
/ 24 февраля 2014

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

 def convert(o: Option[String]): Option[String] = 
    for (x <- o if !x.isEmpty) yield x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...