Попытка понять пример Котлина

Я хочу узнать Котлина и работать с примерами на try.kotlinlang.org

Мне трудно понять некоторые примеры, особенно пример 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 remembered 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}") } 

Вывод:

 computed! lazy = my lazy lazy = my lazy 

Я не понимаю, что здесь происходит. (вероятно, потому, что я не очень хорошо знаком с лямбдами)

  • Почему println () выполняется только один раз?

  • Я также смущен о строке «мой ленивый» Строка не привязана ни к чему (String x = «мой ленивый») или используется в возврате (верните «мой ленивый»)

Может кто-нибудь объяснить, пожалуйста? 🙂

Почему println () выполняется только один раз?

Это происходит потому, что при первом обращении к нему он создается. Чтобы создать, он вызывает лямбду, которую вы передали только один раз, и присваивает значение "my lazy" . Код, который вы написали в Kotlin совпадает с кодом java:

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

Я также смущен о строке «мой ленивый» Строка не привязана ни к чему (String x = «мой ленивый») или используется в возврате (верните «мой ленивый»)

Kotlin поддерживает неявные возвращения для лямбда. Это означает, что последний оператор лямбда считается его возвращаемым значением. Вы также можете указать явный возврат с return@label . В этом случае:

 class LazySample { val lazy: String by lazy { println("computed!") return@lazy "my lazy" } } 
Intereting Posts
NPE по конструктору и суперклассу Переопределить аннотацию @JsonIgnore для некоторых контроллеров. Джексон. весна Kotlin – преобразовать цикл в функциональный стиль Исключение: blockingConnect не следует вызывать в потоке пользовательского интерфейса, несмотря на то, что я добавил другой поток Kotlin inheritnce – Не передано значение для контекста параметра статический эквивалент в Android для kotlin, чтобы избежать утечек памяти обработчика Проверить ожидаемые исключения в Котлине Котлин, инициализирующий объект Есть ли у котлин-родных деструкторы? Как исправить инициализацию поля val с помощью прокси-сервера Spring Security? Hibernate @OneToMany join table throws StackOverflowException Как использовать библиотеку многократного использования в kotlin, с андроидом и javascript? Как загрузить веб-сайт в приложении без загрузки его веб-сайта в Chrome или его приложении? в котлин Разделить список на части Как «Список <MyClass> :: clas.java` в kotlin