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.

Desde método de extensión hasta lambda con receptor, ¿cómo?

class AlgunaClase{
  val logger = ...
  fun (String).capitalizarUltimo():String {
    logger.info("se ha llamado capitalizarUltimo")
    return this.substring(0,this.length-1) + this.substring(this.length-1,this.length).toUpperCase()
  }
  val comoLambda: (String).()->String = ::capitalizarUltimo
}

Quiero decir, siempre podría escribir

val comoLambda: (String).()->String = {
  this.capitalizarUltimo()
}

Pero ¿no hay un azúcar sintáctico usando :: (como con ::println)?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, existe un azúcar sintáctico que utiliza :: y que se puede utilizar para hacer referencia al método de extensión capitalizeLast() como una lambda. Se vería así:

    val asLambda: (String).() -> String = String::capitalizeLast
    

    Esto crea una referencia al método capitalizeLast(), que se puede llamar en un objeto String como una lambda utilizando el método invoke(). Por ejemplo:

    val someString = "hello world"
    val result = someString.asLambda.invoke() // "Hello worlD"
    

    Tenga en cuenta que el método invoke() también se puede llamar utilizando la sintaxis abreviada:

    val result = someString.asLambda() // "Hello worlD"
    

Comments are closed.