将Thread / Runnable实现从Java转换到Kotlin

我有一个现有的Java类ThreadUtils ,每个方法every这样的:

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

我试图把它转换成Kotlin。 我有点挂在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

在Kotlin中,lambda表达式中的return语句与Java中的语句不同。 如果你只写return ,就意味着从关键字fun声明的最内层函数返回,而忽略lambdas – 在你的代码中,这意味着“从every返回”。

要从一个lambda返回,使用限定的return@label – 在你的情况下,它是return@Thread (和第二个例子的return@Runnable ),就像这个简单的代码片段一样:

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

(此代码的可运行演示)

此外,在kotlin-stdlib中有一个thread { ... }函数,您可能会觉得有用(同样,它的lambda的return语句是return@thread )。

你可以在语言参考和这个答案中找到更详细的解释。