#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
), но пока этого достаточно, да