Я заменяю всю проверку на ноль блоком let в моем коде
Первый вопрос здесь, почему?Это как-то более читабельно для вас, чем обычная структура if-else
?Я бы вообще был осторожен с рефакторингом просто ради рефакторинга.
Второе соображение гораздо важнее: это преобразование, которое вы делаете, не эквивалентно исходному коду, вы фактически модифицируете поведение с помощью этогоменять.Возьмем следующий фрагмент кода:
var someValue : String? = null
someValue = "SOF"
someValue?.let {safeSomeValue->
foo(someSafeValue)
bar(someSafeValue)
} ?: run {
println("shouldn't happen if someValue != null")
}
Вы ожидаете, что блок run
будет выполняться только если someValue == null
, но на самом деле это не единственный случай, когда он будет работать.Полное выражение someValue?.let { ... }
может выдавать значения null
не только тогда, когда сам someValue
был null
, но также и если блок, переданный в let
, возвращал null
.В этом случае, если в результате вызова функции bar()
получится null
, оператор run
будет выполнен впоследствии, следовательно, будут выполнены обе ветви того, что вы считали фантастическим оператором if-else
.