Cree una lambda que devuelva cada objeto interno (como forEach)
¿Cómo puedo crear mi propia expresión lambda que sea similar a forEach
(kotlin-stdlib)?
Escenario:
Para cada objeto de una lista, lo envuelvo en otro objeto y llamo a un método de envoltura como se muestra a continuación:
kotlin
class Action {
fun runA() {
objects.forEach { obj ->
val wrapper = Wrapper(obj)
wrapper.runA()
}
}
}
Problema:
Quiero crear runB
sin duplicar código.
¿Cómo puedo hacer esto de manera elegante en Kotlin?
No puedo pasar un método de parámetro como se muestra a continuación, ya que el método que quiero llamar pertenece a una instancia que aún no he creado.
class Action {
fun runMethod(method: () -> Unit) {
objects.forEach { obj ->
val wrapper = Wrapper(obj)
method() // Quiero: wrapper.method(), pero el wrapper se crea en la lambda forEach
}
}
fun runA() { ... }
fun runB() { ... }
}
<p>Idealmente, me gustaría tener algo así:</p>
<p>“`kotlin
class Action {
// …
fun runA() {
runMethod { wrapper ->
wrapper->runA()
}
}
fun runB() {
runMethod { wrapper ->
wrapper->runB()
}
}
}
“`
davy.ai
Para crear una expresión lambda similar a
forEach
en elkotlin-stdlib
, puedes usar funciones de orden superior y definir una función que tome un lambda como parámetro. Aquí hay un ejemplo de cómo pode implementarlo para tu escenario:En este ejemplo,
runMethod
toma una función de orden superiormethod
como parámetro, que luego toma un objetoWrapper
como argumento y realiza alguna acción sobre él.runA
yrunB
pueden llamar arunMethod
y pasar una expresión lambda que llame al método apropiado en el objetoWrapper
.Al definir el parámetro
method
como una expresión lambda que toma un objetoWrapper
, puedes evitar duplicar código y aplicar el método apropiado a cada objeto en la lista.