Как бы вы могли написать следующий код более котлиным способом?
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
блок выполнения. Если запутать, см. Раздел Что такое «приемник» в Котлине? Поэтому я бы нашел следующую реализацию наиболее идеоматичной, при условии правильного назначения параметров для локальной функции:
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 }