Intereting Posts
Не удалось получить вал в Котлине IntelliJ (с использованием gradle): не удается найти плагин Kotlin, даже если он установлен Котлинское преобразование объектов в объекты instance :: class.java vs. instance.javaClass Как провести различие между связанной ссылочной ссылкой элемента и функцией того же типа в котлин? Kotlin JPA: Как бороться с инициализацией @OneToOne Объяснение относительно того, почему это сравнение строк приводит к ошибке? Проверка значений параметров EditText вызывает сбой Весна 5 и Котлин 1.1 Корутинцы: Тип rx.Седулер отсутствует Есть ли способ легко открыть и закрыть поток в котлин? Переопределяющий val, определенный в интерфейсе, с использованием var с тем же именем, определенным в суперклассе Kotlin: Интерфейс Queue не имеет конструкторов Создание комментариев метода / класса Kotlin Понять, как в Котлине действуют переопределенные и подстановочные знаки Присвоение свойств объекту javascript с использованием динамических имен свойств

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

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