2017-04-12 127 views
7

我有一个现有的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来自其中正在定义的功能

+0

我与一些所谓的聪明人发明(又名项目)的日常工作,这让我的工作作为一个恶梦,你混uneccesserly技术,毁了你的一个开发,和其他人的生活这样做。为什么你不能使用java?是不是看起来很愚蠢,必须告诉语言,你是从一个线程写回线程中的return语句返回的?你觉得什么是好的,什么是坏的?创造一些东西时你有没有美感?当你只是做另一件随机事物时,进步并不是什么进展,当你觉得它是正确的时候,进步就是这样。制造更多麻烦不是进步。 –

回答

8

在科特林,里面的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() 
} 

(runnable demo of this code)

而且,有一个thread { ... }功能kotlin-stdlib,你可能会发现有用的(并且,类似地,对于其拉姆达return语句是[email protected])。

您可以找到language referencethis answer更详细的解释。

+0

伟大啊,我不知道在'return'行为的差异 - 感谢指出了这一点,并为'线程{}'快捷方式。 –