有没有更简单的方式来expressionKotlin中的匿名类?
我翻译了这个Java
new Thread("Cute Thread") { public void run() { int a = 3; } }.start();
到这个Kotlin
object : Thread("Cute Thread") { override fun run() { val a = 3 } }.start()
但是我觉得有这样一个更简单的方法,但我找不到任何例子。
我试过了
Thread("Cute Thread") { val a = 3 }.start()
但没有成功…
PS。 我知道,像这样开始一个线程是一个不好的做法。
这里的一个问题是Thread
类的构造函数的Kotlin参数错误。 对于Runnable
您可以轻松使用SAM转换 ( 单个方法接口可以视为lambdaexpression式 ),但是因为lambda不是最后一个参数,所以看起来有点笨拙。 在只有一个参数的情况下,它是好的:
Thread { val a = 3 }.start()
但是,如果有多个参数,它们会反过来导致这个丑陋的语法,lambda作为括号内的参数:
Thread({ val a = 3 }, "some name").start()
相反,你应该使用Kotlin stdlib函数thread()
使用该function,您可以使用以下简单的语法:
// 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()
函数文档
有没有不同的方式来实现匿名类( SAM转换除外)。
但是您仍然可以通过以下方式简化代码:
Thread({ val a = 3 }).start()
或与线程名称:
Thread({ val a = 3 }, "Cute Thread").start()
你的代码是绝对正确的。 简化它的唯一方法是将逻辑提取到一个函数中,然后再使用它:
fun newThread(name: String, block: () -> Unit): Thread { return object : Thread(name) { override fun run() = block() }.start() }
用法:
newThread("Cute Thread") { val a = 3 }
如果你想在你的匿名类中扩展/实现一些类/接口,除了:
object: Thread("Name"){ //... }.start()
当然,最简单的结构是:
val adhoc = object{ // some code here }
但没有更简单的方法来做到这一点。
文档 ,但你可能读过。