转换线程/ Runnable接口的实现从Java到科特林
我有一个现有的Java类ThreadUtils
与方法every
,看起来像:转换线程/ Runnable接口的实现从Java到科特林
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
或类似样式的封闭/拉姆达不会尝试return
来自其中正在定义的功能?
在科特林,里面的lambda return
语句不同于Java的工作方式不同。如果你写的只是return
,这意味着从关键字fun
声明的最内层的函数返回,而忽略lambda表达式 - 在你的代码,这意味着“从every
回报”。
从一个lambda返回,使用合格的[email protected]
- 在你的情况,这是[email protected]
(和[email protected]
对第二个例子),像这样简单的代码片段:
for (i in 1..4) {
Thread {
if (i % 2 == 0)
[email protected]
println("Thread $i")
}.run()
}
而且,有一个thread { ... }
功能kotlin-stdlib
,你可能会发现有用的(并且,类似地,对于其拉姆达return语句是[email protected]
)。
您可以找到language reference和this answer更详细的解释。
伟大啊,我不知道在'return'行为的差异 - 感谢指出了这一点,并为'线程{}'快捷方式。 –
我与一些所谓的聪明人发明(又名项目)的日常工作,这让我的工作作为一个恶梦,你混uneccesserly技术,毁了你的一个开发,和其他人的生活这样做。为什么你不能使用java?是不是看起来很愚蠢,必须告诉语言,你是从一个线程写回线程中的return语句返回的?你觉得什么是好的,什么是坏的?创造一些东西时你有没有美感?当你只是做另一件随机事物时,进步并不是什么进展,当你觉得它是正确的时候,进步就是这样。制造更多麻烦不是进步。 –