我有一个现有的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
?
答案 0 :(得分:10)
在Kotlin中,lambdas中的return
语句与Java中的语句不同。如果只编写return
,则表示从使用关键字fun
声明的最内层函数返回,并且忽略lambdas - 在代码中,它表示从every
返回& #39;
要从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
)。
您可以在language reference和this answer中找到更详细的说明。