Есть ли в Scala библиотечный метод для сборки Option-s, который учитывает пустые строки? - PullRequest
34 голосов
/ 16 декабря 2011

Я хочу отфильтровать пустые строки, чтобы поместить их в Option. Итак, я быстро построил это сейчас:

def StrictOption(s: String) = s match {
  case s if s != null && s.trim.length() > 0 => Some(s)
  case _ => None
}

Вопрос: это может быть уже где-то в стандартной библиотеке?

Ответы [ 6 ]

100 голосов
/ 16 декабря 2011

Я не думаю, что один единственный метод в стандартной библиотеке для этого, но вы можете сделать это гораздо более кратко, чем ваша реализация.

Option(s).filter(_.trim.nonEmpty)
7 голосов
/ 16 декабря 2011

Если вам небезразлична производительность, то

if (s.trim.isEmpty) None else Some(s)

всего на 4 символа длиннее решения Бена Джеймса и в моем тесте работает в 3 раза быстрее (47 против 141).

5 голосов
/ 16 декабря 2011

Там нет ничего встроенного;Фильтр Бена - лучшая краткая версия, если производительность не является проблемой (например, вы проверяете пользовательский ввод).Как правило, производительность не будет проблемой.

Также обратите внимание, что немного странно использовать match, когда вы на самом деле не соответствуете чему-либо;это просто еще один шаблон, чтобы получить утверждение «если-то еще».Просто скажите

if (s ne null && s.trim.length > 0) Some(s) else None

, что примерно так же быстро и кратко, как и все, если только вы не хотите написать свой собственный метод «пробел».Обратите внимание, что trim использует особый критерий: все, что выше \ u0020 (то есть ''), не обрезается, а все, что равно или ниже, является.Таким образом, вы также можете написать свой собственный детектор обрезанной строки-пустым, если выполнение этой операции было особенно важно:

def ContentOption(s: String): Option[String] = {
  if (s ne null) {
    var i = s.length-1
    while (i >= 0) {
      if (s.charAt(i) > ' ') return Some(s)
      i -= 1
    }
  }
  None
}
2 голосов
/ 10 октября 2018

Начиная с Scala 2.13, для тех, кто не ожидает null с (не в контексте Java), Option::unless и Option::when теперь являются альтернативным вариантом:

// val str = "hello"
Option.unless(str.isEmpty)(str)
// Option[String] = Some(hello)
Option.when(str.nonEmpty)(str)
// Option[String] = Some(hello)

// val str: String = ""
Option.unless(str.isEmpty)(str)
// Option[String] = None
Option.when(str.nonEmpty)(str)
// Option[String] = None
0 голосов
/ 26 ноября 2015

Этого также можно достичь с помощью понимания

val res = for (v <- Option(s) if s.nonEmpty) yield v
0 голосов
/ 27 июля 2013

Option («что-то») создает Some («что-то»)

Option (null) создает None

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...