es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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()
}
}
}
“`

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear una expresión lambda similar a forEach en el kotlin-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:

    class Action {
    
      fun runMethod(method: (wrapper: Wrapper) -> Unit) {
        objects.forEach { obj ->
          val wrapper = Wrapper(obj)
          method(wrapper)
        }
      }
    
      fun runA() {
        runMethod { wrapper ->
          wrapper.runA()
        }
      }
    
      fun runB() {
        runMethod { wrapper ->
          wrapper.runB()
        }
      }
    }
    

    En este ejemplo, runMethod toma una función de orden superior method como parámetro, que luego toma un objeto Wrapper como argumento y realiza alguna acción sobre él. runA y runB pueden llamar a runMethod y pasar una expresión lambda que llame al método apropiado en el objeto Wrapper.

    Al definir el parámetro method como una expresión lambda que toma un objeto Wrapper, puedes evitar duplicar código y aplicar el método apropiado a cada objeto en la lista.

Comments are closed.