Conversión de la implementación Thread / Runnable de Java a Kotlin

Tengo una class de Java existente ThreadUtils con un método que se ve así:

 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; } } 

Y estoy tratando de convertirlo a Kotlin. Estoy un poco colgado en el cierre de Runnable. Esto falla con un mal 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 } 

También intenté sacar el Runnable solo para ayudarme a separar las cosas, pero esto también falla de la misma manera:

 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 } 

¿Cómo puedo implementar un @FunctionalInterface o cierre / lambda de estilo similar que no intente return desde la function en la que se está definiendo?

En Kotlin, las instrucciones de return dentro de lambdas funcionan de forma diferente a las de Java. Si escribe simplemente return , significa regresar de la function más interna declarada con palabras key fun , e ignora lambdas: en su código, significa 'devolver de every '.

Para regresar de una lambda, use la return@label : en su caso, es return@Thread (y return@Runnable para el segundo ejemplo), como en este fragment simplificado:

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

(demostración ejecutable de este código)

Además, hay una function de thread { ... } en kotlin-stdlib que puede encontrar útil (y, de manera similar, la statement de retorno para su lambda es return@thread ).

Puede encontrar una explicación más detallada en la reference del idioma y en esta respuesta .

  • ¿Cómo implementar esta interfaz Java en Kotlin?
  • ¿Cómo puedo declarar un parámetro de function que puede ser una cadena o una function en Kotlin?
  • ¿Cómo usar SQLite en Kotlin / Native?
  • Llamar a kotlin funciones que son palabras key en java de java?
  • Kotlin Vertx Type Mismatch encontrado Future <Unit> expected Handler <AsyncResult <Void >>
  • Buscador privado y establecedor público para una propiedad de Kotlin
  • ¿Por qué tengo que devolver Unit.INSTANCE al implementar en Java una function Kotlin que devuelve una Unidad?
  • Choque de statement de plataforma con comparable
  • Anular setter para la variable definida en el constructor pnetworkingeterminado
  • ¿Es posible build una aplicación web completa de Node.js usando Kotlin?
  • 'x' no es una function al pasar parameters en Kotlin Javascript