Материал про использование let я увидел на канале Android Live, а оригинальная статья вот.
Не вижу смысла переводить всю статью, так как пост на канале сделал отличную выжимку. А я просто добавлю отсебятины.
Для начала let. Это шикарно. С null безопасным Kotlin просто невозможно не знать эту специальную функцию, которая будет выполнена только в случае, если переменная…собственно не null.
Но как показывает автор статьи, иногда есть более подходящие решения для некоторых случаев и бездумно летить всё подряд тоже не нужно.
Итак, когда лучше не использовать let
1 2 3 4 5 6 7 8 |
webviewSetting?.let { it.javaScriptEnabled = true it.databaseEnabled = true } webviewSetting?.run { javaScriptEnabled = true databaseEnabled = true } |
1 2 3 4 5 6 7 8 9 |
// НЕТ stringList?.let { println("Total Count: ${it.size}") it }?.forEach{ println(it) } // ТОЖЕ НЕТ, НО ЛУЧШЕ stringList?.also { println("Total Count: ${it.size}") }?.forEach{ println(it) } |
Когда же тогда использовать let
1 2 3 4 5 |
private var str: String? = null fun process() { str?.let { /*Do something*/ } } |
1 2 3 4 5 6 7 |
var javaScriptEnabled = false var databaseEnabled = false webviewSetting?.let { javaScriptEnabled = it.javaScriptEnabled databaseEnabled = it.databaseEnabled } |
Это удобнее для review кода, чем функция run. Впрочем и run может подойти, если имена будут с какими-то префиксами или вроде того.
?
. Например:
1 2 3 4 5 6 7 |
return string?.asIterable()?.distinct()?.sorted() генерирует больше байткода, чем: return string?.let { it.asIterable().distinct().sorted() } |
Итак. LET удобный инструмент, но у него есть более удобные для некоторых случаев альтернативы, и его тоже нужно использовать с умом.
Спасибо!