2017-04-12 125 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'行爲的差異 - 感謝指出了這一點,併爲'線程{}'快捷方式。 –