Kotlin как добавить возврат класса данных из when в список

#android #kotlin

#Android #kotlin

Вопрос:

У меня есть класс данных Worker, я хочу создать новые рабочие данные и добавить их в список при выполнении некоторого условия.

Вот как я создаю нового работника,

 var workerList = arrayListOf<Worker>()

when(hirePosition){
  android -> Worker(nameA, ageA)
  ios ->  Worker(nameB, ageB)
}   

Я знаю, что могу использовать метод workerList.add() для добавления данных в список, но я не знаю, как сделать это при возврате из условия when.

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

Ответ №1:

исчерпывающий when должен иметь else ветвь

 when(hirePosition){
  android -> Worker(nameA, ageA)
  ios ->  Worker(nameB, ageB)
  else -> null
}?.let { workerList.add(it) }
  

Комментарии:

1. ‘let’ — это ключи, я могу получить доступ к конкретному worker() внутри let {}, спасибо.

Ответ №2:

Я не совсем понимаю, что вы имели в виду, но вы можете вернуться из when вот так:

 val worker: Worker = when(hirePosition) {
  android -> Worker(nameA, ageA)
  ios ->  Worker(nameB, ageB)
}

workerList.add(worker)
  

Ответ №3:

В kotlin if when используется как выражение, значение удовлетворенной ветви становится значением общего выражения

Итак, возможны варианты:

 var workerList = mutableListOf<Worker>()

val newWorker = when(hirePosition){
    android -> Worker(nameA, ageA)
    ios ->  Worker(nameB, ageB)
} 
workerList  = newWorker
  

или

 workerList  = when(hirePosition){
    android -> Worker(nameA, ageA)
    ios ->  Worker(nameB, ageB)
} 
  

или даже

 val workerList = listOf<Worker>(
    when(hirePosition){
        android -> Worker(nameA, ageA)
        ios ->  Worker(nameB, ageB)
    } 
)
  

Выберите наиболее подходящий для вашего случая / codestyle. Например, последний вариант хорош для инициализации неизменяемого списка (вы всегда должны предпочитать неизменяемый, а не изменяемый)

Ответ №4:

when это выражение, оно возвращает результат для любой ветви, которую оно оценивает, поэтому вы можете присвоить этот результат чему-то, например val worker = when... , или вы можете вернуть его как return when ... , или вы можете связать с ним вызов функции, например when {...}.hire()

У Kotlin есть множество функций области видимости, например, let которые запускаются на объекте и позволяют вам что-то с ним делать — их много, и они отличаются в основном тем, как вы получаете доступ к объекту внутри функции (запускаете ли вы что-то на нем или делаете что-то с ним — в основном, приемник против переменной) и возвращают ли онирезультат этой функции или то, что было передано изначально, или вообще ничего

В любом случае, большинство из них будут работать для того, что вы делаете, выполняя операцию над вашим результатом, и все. Вы даже можете использовать ссылку на функцию — when {...}.run(workerList::add) но это дело вкуса (мне это очень нравится, когда подходит!)


Но более подходный подход Kotlin заключается в создании всего списка сразу, поэтому вместо этого это фиксированный неизменяемый список. Это зависит от вашего варианта использования — если вам нужно продолжать добавлять людей в разное время, это, вероятно, не сработает. Но на всякий случай, вот один из способов, которым вы могли бы сгенерировать свой список:

 fun getWorker(position: HirePosition) = when(position) {
      android -> Worker(nameA, ageA)
      ios ->  Worker(nameB, ageB)
}

// or map(::getWorker)
val workerList = availablePositions.map { getWorker(it) } 
  

Это общий подход «преобразовать коллекцию вещей в список других вещей *. Вы могли бы вставить when блок в map лямбда-выражение, но я думаю, что более удобно разбить его на собственную функцию и дать ему читаемое имя.

Есть и другие вещи, которые вы можете сделать, например buildList (берет изменяемый список и позволяет добавлять к нему — чтобы вы могли запустить его на куче HirePosition s, чтобы добавить больше к вашему workerList ), но пока этого достаточно, да