2015-05-08 5 views
0

В приведенном ниже фрагменте кода:Scala для понимания - решения нулевой

for { 
    strVal <- str 
    longVal <- str.strToLong 
} yield longVal 

где ул вариант [String]. Что делать, если вступает в силу Some (null)? Как справиться с этим в моем понимании?

+4

Ну, как вы хотите, чтобы справиться с этим? Что вы хотите, когда 'str' является' Some (null) '? – rightfold

+1

Я предполагаю, что вы имели в виду: 'для { strVal <- str; longVal <- strVal.strToLong } yield longVal' Вы можете использовать: 'strValNullable <- str; strVal <- Option (strValNullable); longVal <- strVal.strToLong' –

+4

Я думаю, что простой ответ - «не делай этого». Весь смысл «Option» заключается в том, чтобы избежать необходимости в null. Если вы используете библиотеки Java, которые могут возвращать значение null, то как можно скорее выполните дезинфекцию значений с помощью конструктора 'Option()' apply, который преобразует 'null' в' None' – DNA

ответ

1

Я думаю, что вы имеете дело с Some(null), потому что вы использовали этот конструктор в своем коде. Попробуйте Option(variableWithNull), и результатом будет None. Тогда все операции с None будут иметь результат None вместо раздражающего java.lang.NullPointerException.

Может быть, вы могли бы использовать этот код:

val str: Option[String] = Option(null) 
str.fold(0L) {_.toLong} 
0

Some(null) должен быть индикатором того, что выше код делает что-то неправильно. Как правило, при упаковке чего-то, что может вернуть значение null в Option, применяется Option, так как Option(null) оценивает None.

Если же у вас нет возможности влиять на это, вы всегда можете flatMap его к None:

str.flatMap(Option(_)) 
Смежные вопросы