Я думаю, что большинство можно сделать с помощью safe operator ?.
. Поэтому, если вы просто хотите перебрать список (или reduce
, map
, или что-то еще), вы можете просто сделать это напрямую:
val sumExpression = list?.joinToString("+") { it.someValue } ?: throw exception? use default value?
list?.forEach { println("an entry in the list: $it") } // if there are entries, just iterate over them... if not, there is nothing to do
list?.also {
consume(it) // consume now is only called if the list is not null
}
Улучшить его с помощью условия также довольно просто с помощью takeIf
или takeUnless
(в зависимости от того, что вам требуется):
list?.takeIf { it.isNotEmpty() }
Теперь у вас все еще есть список, который можно обнулять, и вы можете снова вызвать любую из желаемых функций, как показано ранее:
list?.takeIf( it.isNotEmpty() }?.also {
consume(it)
}
Также вариант вместо list.isNullOrEmpty()
(уже показанный gpuntos answer ) заключается в сравнении возможного нулевого значения с ожидаемым результатом, например ::
if(list?.isNotEmpty() == true) {
// do something with the non-empty list
}
В случае null
условие упрощается до null == true
, что составляет false
. Однако я бы не стал слишком злоупотреблять этим, так как тогда вы уже не сможете легко увидеть настоящие обнуляемые типы. Такое использование может иметь смысл, если то, что вы пытаетесь вычислить, еще не поддерживается в его собственной функции расширения (как в случае isNullOrEmpty()
), например для ввода if
, только если count
равно 4, имеет смысл использовать что-то вроде: if (list?.count() == 4)
...