有没有更简单的方式来表达Kotlin中的匿名类?

问题描述:

我翻译这个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。我知道像这样开始一个线程是一个不好的习惯。

的一个问题是,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答案已经现代化 –

如果你想扩展/在你的匿名类实现一些类/接口,没有其他办法比:

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

最简单的结构当然是:

val adhoc = object{ 
    // some code here 
} 

但有并不是简单的方法来做到这一点。

Documentation,但你可能读过。

没有什么不同的方式来实现匿名类(SAM conversions除外)。
但你仍然可以通过简化代码:

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

或线程名:

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

你没有提供一个解决问题的方法(匿名类的语法),而是以不同的方式使用'Thread'类。 – nhaarman

+0

@nhaarman你确定他的问题是关于较短的匿名类或更短的代码?如果你是一个纯粹主义者,你是对的,但是如果努力了解他的真实意图,你可能会错的:“但我觉得有一个更简单的方法来做这件事,但我找不到任何例子。 – mklimek

+0

是的,我的目标是缩短代码,谢谢!对不起,如果我不清楚我的问题。只要不影响可读性,我只需要更少的代码。这是我从Java到Kotlin的主要原因。 – PedroD

你的代码是完全正确的。简化它的唯一方法是将其解压缩逻辑成一个函数,然后再用它:

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