Intereting Posts
Как вызвать конструктор String Java (char , int offset, int length) из Kotlin? Как отменить подписку на события в TornadoFX? Неразрешенная контрольная ошибка в copyOfRange Дооснащение – пропустите два параметра Kotlin: Почему я не могу выполнить задание в защитнике цикла? Обновление для поддержки 27 и SDK 27 из 25, авария на Android 4.4 сейчас Прослушивание сообщений и написание команд по наблюдаемому потоку Аргументы по умолчанию Kotlin: запретить вызовы с нулевыми аргументами В чем разница при добавлении частного модификатора к аргументам в конструкторе Kotlin? Доступ к атрибуту карты Entry (Kotlin) Передача списка объектов в фрагмент Сложить список для сопряжения с назначением деструктуризации в котлин Android Koltin передает значения spinner в изменяемый список Кинжал и учетные данные для входа Любой способ унаследовать один и тот же общий интерфейс дважды (с отдельными типами) в Котлин?

Преобразование реализации 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 ).

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