Intereting Posts
Как объединить флаги Intent в Котлине Тестирование AnkoComponents и насмешка AnkoContext Подстановочный шаблон дженериков Котлина с расширением Как назвать конкретную лямбду в макет класса? permissionsdispatcher и несколько @ NeedsPermission с kotlin Преобразование императивной функции root в функциональный стиль в kotlin Ошибка при выполнении Java-процесса с основным классом com.google.devtools.build.android.desugar.Desugar Нет метаданных android.content.SyncAdapter Может ли поле быть перенесено в не нулевую версию? В чем разница между свойствами и параметрами в Котлине? Почему прокрутка ViewPager перед тем, как изменить его заполнение и pagemargin, полностью подвела его? Как высмеять kotlin ByteArray с помощью Mockito? Как сделать первичный ключ как автоинкремент для Room Persistence lib Kotlin – Использование Enums для извлечения Char В Котлине я могу переопределить некоторые существующие операторы, но как насчет создания новых операторов?

Когда я должен использовать let {} и когда просто просто! = Null

Как бы вы могли написать следующий код более котлиным способом?

var returnValue = ... val s3data = presignedUrl.body() if (s3data != null) { val uploadImage = api.uploadImage(s3data.bucketUrl, s3data.awsAccessKeyId, s3data.policy, s3data.key, s3data.signature, body).execute() if (!uploadImage.isSuccessful) { crashReporterService.sendIssue("Failed uploading file", "Failed uploading file ${uploadImage.raw()}") returnValue = Result.FAILURE } else { returnValue = Result.SUCCESS } } else { crashReporterService.sendIssue("Failed uploading image", "Error - ${presignedUrl.raw()}") returnValue = Result.FAILURE } return returnValue 

Я могу использовать let, но я чувствую, что это делает код более сложным для понимания

  • Общий общий код – в этом случае сообщение об ошибках и возврат с результатом отказа – могут быть объединены в локальную функцию .
  • Отказоустойчивость, вызывающая возврат (в этом случае s3data подлежащая s3data ), обычно может быть заменена возвращающим оператором: elvis .
  • При вводе одной и той же переменной снова и снова (в этом случае при доступе к s3data ) целесообразно run блок выполнения. Если запутать, см. Раздел Что такое «приемник» в Котлине?
  • Как уже говорилось в другом ответе, если / else блоки являются выражением в Котлине.

Поэтому я бы нашел следующую реализацию наиболее идеоматичной, при условии правильного назначения параметров для локальной функции:

 fun foo() { fun failure(p0: String, p1: String) = crashReporterService.sendIssue(p0, p1).let { Result.FAILURE } val s3data = presignedUrl.body() ?: return failure("Failed uploading image", "Error - ${presignedUrl.raw()}") val uploadImage = s3data.run { api.uploadImage(bucketUrl, awsAccessKeyId, policy, key, signature, body).execute() } return if (uploadImage.isSuccessful) { Result.SUCCESS } else { failure("Failed uploading file", "Failed uploading file ${uploadImage.raw()}") } } 

Ваш вопрос граничит с просмотром кода, поэтому вы, вероятно, также с удовольствием узнаете, что для этого есть выделенная сеть Stack Exchange. Однако прежде прочитайте руководство по обзору кода для пользователей переполнения стека .

if / else – выражение в Kotlin , поэтому следующее, конечно, больше Kotlinesque:

 val s3data = presignedUrl.body() return if (s3data != null) { val uploadImage = api.uploadImage(s3data.bucketUrl, s3data.awsAccessKeyId, s3data.policy, s3data.key, s3data.signature, body).execute() if (!uploadImage.isSuccessful) { crashReporterService.sendIssue("Failed uploading file", "Failed uploading file ${uploadImage.raw()}") Result.FAILURE } else { Result.SUCCESS } } else { crashReporterService.sendIssue("Failed uploading image", "Error - ${presignedUrl.raw()}") Result.FAILURE }