Intereting Posts
Имущество с различным типом android – Запуск приложения с ошибкой «com.android.builder.dexing.DexArchiveMergerException: невозможно слить dex ' Есть ли способ передать ссылку на функцию между действиями? «Лямбда с приемником»: что это за конструкция Котлин? Сканер Bluetooth Low Energy работает нормально, но не находит никаких устройств Kotlin и Dagger: могу ли я использовать объект @Inject для объекта, который все еще делает его нулевым / необязательным? Проблемы с доступом к сопутствующему объекту Kotlin в Groovy? Ошибка переноса подпункта: com.android.dx.cf.code.SimException: local 0007: недействительный Kotlin с картой в Android Dagger2 и квалификаторы в зависимых компонентах Текст мигает в Android, с наиболее кратким Kotlin использование Room with kotlin, получение исключения при создании базы данных Наследование Котлина с дженериками libgdx AssetManager preload ttf шрифт не работает Невозможно решить ошибку «Content-Length and stream length notagree»

Преобразование реализации Thread / Runnable из Java в Kotlin

У меня есть существующий Java-класс ThreadUtils с методом, который выглядит так:

 public class ThreadUtil { public static Thread every(int seconds, Runnable r) { Thread t = new Thread(() -> { while(true) { r.run(); try { Thread.sleep(1000 * seconds); } catch (InterruptedException e) { return; } } }); t.start(); return t; } } 

И я пытаюсь преобразовать его в Котлин. Я немного повесил трубку на Runnable. Это терпит неудачу с плохим return :

 fun every(seconds: Int, r: Runnable): Thread { val t = Thread({ while (true) { r.run() try { Thread.sleep((1000 * seconds).toLong()) } catch (e: InterruptedException) { return // ERROR: This function must return a value of type Thread } } }) t.start() return t } 

Я также попытался вытащить Runnable только для того, чтобы помочь себе отдельные вещи, но это также не срабатывает одинаково:

 fun every(seconds: Int, r: Runnable): Thread { val internalRunnable = Runnable { while (true) { r.run() try { Thread.sleep((1000 * seconds).toLong()) } catch (e: InterruptedException) { return // ERROR: This function must return a value of type Thread } } } val t = Thread(internalRunnable) t.start() return t } 

Как я могу реализовать @FunctionalInterface или аналогичный стиль / lambda, который не пытается return из функции, в которой он определяется?

Solutions Collecting From Web of "Преобразование реализации Thread / Runnable из Java в Kotlin"

В Kotlin операторы return внутри lambdas работают иначе, чем в Java. Если вы пишете только return , это означает возврат из самой внутренней функции, объявленной с потерей ключевых слов, и она игнорирует lambdas – в вашем коде это означает «возврат от every ».

Чтобы вернуться из лямбды, используйте квалифицированную return@label – в вашем случае это return@Threadreturn@Runnable для второго примера), как в этом упрощенном фрагменте:

 for (i in 1..4) { Thread { if (i % 2 == 0) return@Thread println("Thread $i") }.run() } 

(runnable demo этого кода)

Кроме того, существует функция thread { ... } в kotlin-stdlib которую вы можете найти полезной (и, аналогично, оператор return для его лямбда – return@thread ).

Вы можете найти более подробное объяснение в языковой ссылке и в этом ответе .