Tratando de entender el ejemplo de Kotlin

Quiero aprender Kotlin y estoy trabajando en los Ejemplos en try.kotlinlang.org

Tengo problemas para entender algunos ejemplos, particularmente el ejemplo de propiedad Lazy: https://try.kotlinlang.org/#/Examples/Delegated%20properties/Lazy%20property/Lazy%20property.kt

/** * Delegates.lazy() is a function that returns a delegate that implements a lazy property: * the first call to get() executes the lambda expression passed to lazy() as an argument * and remembers the result, subsequent calls to get() simply return the remembenetworking result. * If you want thread safety, use blockingLazy() instead: it guarantees that the values will * be computed only in one thread, and that all threads will see the same value. */ class LazySample { val lazy: String by lazy { println("computed!") "my lazy" } } fun main(args: Array<String>) { val sample = LazySample() println("lazy = ${sample.lazy}") println("lazy = ${sample.lazy}") } 

Salida:

 computed! lazy = my lazy lazy = my lazy 

No entiendo lo que está pasando aquí. (Probablemente porque no estoy muy familiarizado con lambdas)

  • ¿Por qué println () solo se ejecuta una vez?

  • También estoy confundido acerca de la línea "my holgazán", el String no está asignado a nada (String x = "my perezoso") o usado en un return (return "my perezoso")

¿Alguien puede explicar por favor? 🙂

    ¿Por qué println () solo se ejecuta una vez?

    Eso sucede porque la primera vez que accedes a él, se crea. Para ser creado, invoca la lambda que pasaste solo una vez y asigna el valor "my lazy" . El código que escribió en Kotlin es el mismo de este código de Java:

     public class LazySample { private String lazy; private String getLazy() { if (lazy == null) { System.out.println("computed!"); lazy = "my lazy"; } return lazy; } } 

    También estoy confundido acerca de la línea "my holgazán", el String no está asignado a nada (String x = "my perezoso") o usado en un return (return "my perezoso")

    Kotlin admite retornos implícitos para lambda. Significa que la última statement de una lambda se considera su valor de retorno. También puede especificar un retorno explícito con la return@label . En este caso:

     class LazySample { val lazy: String by lazy { println("computed!") return@lazy "my lazy" } }