Подтвердить что ты не робот

Имеет ли Scala библиотечный метод для создания опций, которые учитывают пустые строки?

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

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

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

4b9b3361

Ответ 1

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

Option(s).filter(_.trim.nonEmpty)

Ответ 2

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

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

- всего 4 символа дольше, чем решение Ben James, и работает в 3 раза быстрее, в моем тесте (47 против 141).

Ответ 3

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

Также обратите внимание, что немного странно использовать match, когда вы на самом деле ничего не согласны; это просто более шаблонный, чтобы получить инструкцию if-else. Просто скажите

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

который примерно такой же быстрый и короткий, как и все, если вы не хотите писать свой собственный метод is-it-whitespace. Обратите внимание, что 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
}

Ответ 4

Это также может быть достигнуто с пониманием

val res = for (v <- Option(s) if s.nonEmpty) yield v

Ответ 5

Опция ( "что-то" ) создает Some ( "something" )

Опция (null) производит None