Как преобразовать некоторые ("") в 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)