将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中,lambdaexpression式中的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
)。
你可以在语言参考和这个答案中find更详细的解释。