«Если» против «takeIf» в Котлине?

Какая из следующих двух реализаций лучше:

1.use "if"

fun f1(a: A?): R? { if (a != null) { val b = getB(a) if (b != null && bf()) { val c = getC(b) if (c != null && cf()) { return c.f2() } } } return null } 

2.use "takeIf" и "let"

 fun f2(a: A?): R? = a ?.let { getB(it) } ?.takeIf { it.f() } ?.let { getC(it) } ?.takeIf { it.f() } ?.let { it.f2() } 

«takeIf» и «let» – лучший подход. Хотя сначала это немного сложнее, но, поскольку у вас будет опыт с выражением лямбда, вы обнаружите, что они действительно помогают в полной мере.

Kotlin – это новый язык, и одним из преимуществ является удаление кода шаблона.

 fun f2(a: A?): R? = a ?.let { getB(it) } ?.takeIf { it.f() } ?.let { getC(it) } ?.takeIf { it.f() } ?.let { it.f2() } 

Этот фрагмент кода делает именно это. Он просто удалил уродливое 4-уровневое вложение условий if.

Надеюсь, поможет.

Это своего рода субъективный вопрос. Некоторые люди любят одну версию, другие – другие. Лично я считаю, что это более читаемо:

 fun f3(a: A?): R? { if (a == null) { return null } val b = getB(a) if (b == null || !bf()) { return null } val c = getC(b) if (c == null || !cf()) { return null } return c.f2() } 

Let / takeIf в этом примере очень трудно читать. Возможно, будет полезен другой отступ, но тот факт, что имена функций настолько искусственны, и результат каждого get имеет идентично названную функцию «f», все это способствует этой проблеме.

Пусть и takeIf может быть хорошо читаемым в более нормальных случаях.

Разделение на отдельные утверждения в этом искусственном случае, будь то использование let / takeIf или условное «если» помогает в этом примере.

Intereting Posts
Процессор аннотации Kotlin дает ошибку времени компиляции при использовании Room with Android Studio 3.0 beta7 двойная запись: META-INF / myLibrary.kotlin_module Android-библиотека, Kotlin и Dagger2 Как вы пишете вторичные конструкторы для класса с параметрами типа? Как связать со статическим членом класса Java в KDoc? Почему я могу вставить код строки до DayForecast (HashMap (it)) в Котлин? Нестандартное свойство с пользовательским сеттером Kotlin Что означает <ClassName>. () В Котлине? Функция в возвратном значении kotlin перед концами Fuel.post Как хранить данные типа reified в полях экземпляров в Kotlin? Работа Gradle работает на локальной машине, но не работает на сервере Jenkins CI? Android kotlin: невозможно прочитать файл класса Как передать параметр типа в ссылку на общий конструктор класса? Есть ли такой синтаксис, как #region #endregion в Котлине? Преобразование моего существующего проекта студии andorid в kotlin?