Каков идиоматический способ создания объекта в Котлине, если атрибут не пуст и не равен нулю

как идиоматично написать этот код в Котлине?

  fun createAnswerValue(record: Record):  QuestionnaireResponseItemComponent{
    val list = createAnswerList(record)
    if (list.isNotEmpty()) {
        return QuestionnaireResponseItemComponent().apply {
            linkId = record.siblingIndexUID
            answer = list
        }
    }
    return null

}

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это может быть однострочный.

ОБНОВЛЕНИЕ: как упоминалось в комментариях @Tenfour04, было бы более эффективно сначала проверить список на предмет отсутствия обнуления:

fun createAnswerValue(): QuestionnaireResponseItemComponent? =
    createAnswerList(record)
        ?.takeIf { it.isNotEmpty() }
        ?.let {
            QuestionnaireResponseItemComponent(
                linkId = record.siblingIndexUID,
                answer = it
            )
        }

Я бы убрал takeIf из let для удобочитаемости и во избежание создания ненужных объектов.

Tenfour04 09.04.2022 16:53

@ Tenfour04 Tenfour04 он по-прежнему всегда создает этот объект Component до того, как будет рассмотрен предикат takeIf, верно? (Возможность вызова isNotEmpty в списке означает, что createAnswerList не может возвращать значение null)

cactustictacs 09.04.2022 21:15

@cactustictacs, поэтому я сказал, что его нужно убрать из разрешения.

Tenfour04 09.04.2022 21:37

@ Tenfour04 Tenfour04 да, это то, что я имею в виду - let все равно будет работать и возвращать значение до того, как следующий takeIf запустит это значение, верно? Я просто удостоверяюсь, что ничего не упускаю, так как я сделал версию, которая этого избегает!

cactustictacs 09.04.2022 21:44

@cactustictacs, вот что я предлагаю: createAnswerList(record)?.takeIf { it.isNotEmpty() } ?.let { QuestionnaireResponseItemComponent(linkId = record.siblingIndexUID, answer = it) }, но с каждой функцией в отдельной строке для удобства чтения.

Tenfour04 09.04.2022 22:24

@ Tenfour04 Спасибо! Обновлен ответ

Михаил Нафталь 09.04.2022 23:27

@ Tenfour04 аааа, ок, понял, я думал, ты имеешь в виду пометить это в конце let, просто из-за того, где оно уже было. Спасибо!

cactustictacs 09.04.2022 23:38

Лично я бы сделал так:

fun createAnswerValue(record: Record): QuestionnaireResponseItemComponent? {
    val list = createAnswerList(record)
    return if (list.isNotEmpty()) QuestionnaireResponseItemComponent().apply {
        linkId = record.siblingIndexUID
        answer = list
    } else null
}

что в значительной степени то, что у вас уже было, просто с использованием else и в результате с поднятым return. Это просто и читабельно!

Если вы хотите использовать takeIf, как в ответе @Mihail, я бы, вероятно, сделал это следующим образом:

fun createAnswerValue(): QuestionnaireResponseItemComponent? =
    createAnswerList(record)
        .takeIf { it.isNotEmpty }
        ?.let { list ->
            QuestionnaireResponseItemComponent().apply {
                linkId = record.siblingIndexUID
                answer = list
            }
        }

разница в том, что в этом объект создается только в том случае, если он будет возвращен - если вам все равно, то версия Михаила явно более компактна!

Но эта версия Kotliny делает то же самое, что и if/else, которую я опубликовал — я бы сказал, что эта версия более читабельна, чем эта (хотя это не так уж плохо). Объединение нескольких вызовов вместе может сделать вещи красивыми, читабельными и элегантными, но также может чрезмерно усложнить вещи и затруднить точное понимание того, что происходит. И я определенно написал свою справедливую долю этого! Поэтому я чувствую, что с «идиоматическим» кодом нужно быть осторожным — знать свои варианты — это хорошо! Но используйте то, что работает, не думайте, что вам нужно использовать языковую функцию, потому что она есть, IMO

Другие вопросы по теме