В Scala большинство структур управления являются выражениями , а не выражениями .
Таким образом, if-else
должен возвращать значение. Поскольку у вас нет ветки else
, компилятор вставляет эту else ()
. Таким образом, ваш код иногда возвращает Строки , другие времена Единица , и LUB из этих двух типов равен Любой .
Есть несколько способов решить эту проблему, один из них - убедиться, что в списке нет nulls
до map
(обычно в Scala мы никогда не ожидаем null
) . Другое - возвращать какое-то значение по умолчанию, если строка, например, null
и пустая строка. Другой способ - использовать тип данных Option для представления пропущенных значений.
Вот несколько советов:
list.filter(_ != null).map(_.toLowerCase)
list.collect { case str if (str != null) => str.toLowerCase }
list.map(str => if (str != null) str.toLowerCase else "")
list.map(str => Option(str).map(_.toLowerCase))
list.map(str => Option(str).map(_.toLowerCase)).getOrElse("")
list.map(str => Option(str).fold(ifEmpty = "")(_.toLowerCase))
list.flatMap(str => Option(str).map(_.toLowerCase))
Я бы порекомендовал вам последние четыре, как прямые манипулирование null
в Scala не рекомендуется. За исключением случаев, когда производительность является обязательной, а выделение Option
слишком дорого для вашего варианта использования (что бывает редко) .