Ответ 1
Я не думаю, что в стандартной библиотеке есть один единственный метод, но вы можете сделать это намного ближе, чем ваша реализация.
Option(s).filter(_.trim.nonEmpty)
Я хочу отфильтровать пустые строки, чтобы поместить их в параметр. Поэтому я быстро построил это сейчас:
def StrictOption(s: String) = s match {
case s if s != null && s.trim.length() > 0 => Some(s)
case _ => None
}
Вопрос: возможно, это уже где-то в стандартной библиотеке?
Я не думаю, что в стандартной библиотеке есть один единственный метод, но вы можете сделать это намного ближе, чем ваша реализация.
Option(s).filter(_.trim.nonEmpty)
Если вам вообще не нужна производительность,
if (s.trim.isEmpty) None else Some(s)
- всего 4 символа дольше, чем решение Ben James, и работает в 3 раза быстрее, в моем тесте (47 против 141).
Там ничего не построено; Бен-фильтр - лучшая краткая версия, если производительность не является проблемой (например, вы проверяете ввод пользователя). Как правило, производительность не будет проблемой.
Также обратите внимание, что немного странно использовать 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
}
Это также может быть достигнуто с пониманием
val res = for (v <- Option(s) if s.nonEmpty) yield v
Опция ( "что-то" ) создает Some ( "something" )
Опция (null) производит None