2016-09-19 63 views
1

我翻譯這個Java有沒有更簡單的方式來表達Kotlin中的匿名類?

new Thread("Cute Thread") { 
    public void run() { 
    int a = 3; 
    } 
}.start(); 

這個科特林

object : Thread("Cute Thread") { 
    override fun run() { 
    val a = 3 
    } 
}.start() 

但我覺得有這樣做的一個簡單的方法,但我找不到任何的例子。

我已經試過

Thread("Cute Thread") { val a = 3 }.start() 

,但沒有成功...

PS。我知道像這樣開始一個線程是一個不好的習慣。

回答

1

的一個問題是,Thread類的構造函數有一個參數糟糕的Kotlin訂單。對於Runnable,您可以輕鬆使用SAM conversion單個方法接口可以視爲lambda),但由於lambda不是最後一個參數,它看起來有點笨重。在那裏只有一個參數的情況下,它是罰款:

Thread { val a = 3 }.start() 

然而,隨着多個參數,它們是向後造成這種醜陋的語法與拉姆達爲括號內的參數:

Thread({ val a = 3 }, "some name").start() 

相反,你應該使用科特林STDLIB功能thread()

你所擁有的簡單的語法功能:

// create thread, auto start it, runs lambda in thread 
thread { val a = 3 } 

// create thread with given name, auto start it, runs lambda in thread 
thread(name = "Cute Thread") { val a = 3 } 

// creates thread that is paused, with a lambda to run later 
thread(false) { val a = 3 } 

// creates thread that is paused with a given name, with a lambda to run later 
thread(false, name = "Cute Thread") { val a = 3 } 

參見:thread() function documentation

+0

太棒了!謝謝! – PedroD

+1

@PedroD答案已經現代化 –

1

如果你想擴展/在你的匿名類實現一些類/接口,沒有其他辦法比:

object: Thread("Name"){ 
    //... 
}.start() 

最簡單的結構當然是:

val adhoc = object{ 
    // some code here 
} 

但有並不是簡單的方法來做到這一點。

Documentation,但你可能讀過。

4

沒有什麼不同的方式來實現匿名類(SAM conversions除外)。
但你仍然可以通過簡化代碼:

Thread({ val a = 3 }).start() 

或線程名:

Thread({ val a = 3 }, "Cute Thread").start() 
+1

你沒有提供一個解決問題的方法(匿名類的語法),而是以不同的方式使用'Thread'類。 – nhaarman

+0

@nhaarman你確定他的問題是關於較短的匿名類或更短的代碼?如果你是一個純粹主義者,你是對的,但是如果努力瞭解他的真實意圖,你可能會錯的:「但我覺得有一個更簡單的方法來做這件事,但我找不到任何例子。 – mklimek

+0

是的,我的目標是縮短代碼,謝謝!對不起,如果我不清楚我的問題。只要不影響可讀性,我只需要更少的代碼。這是我從Java到Kotlin的主要原因。 – PedroD

2

你的代碼是完全正確的。簡化它的唯一方法是將其解壓縮邏輯成一個函數,然後再用它:

fun newThread(name: String, block:() -> Unit): Thread { 
    return object : Thread(name) { 
     override fun run() = block() 
    }.start() 
} 

用法:

這裏
newThread("Cute Thread") { 
    val a = 3 
} 
+2

如果你準備寫這樣的函數,在stdlib中已經有了一個可供你使用的函數:https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/thread.html – Ilya

相關問題