Kotlin 中的成语
Kotlin 中的数据类是为保存数据而创建的类。这些类被标记为数据:
data class User(var firstname: String, var lastname: String, var age: Int)
上面的代码创建了一个 User 类,并自动生成了以下内容:
- 所有属性的获取器和设置器(仅用于vals的获取器)
- 等于()
- 哈希码()
- toString()
- 复制()
- componentN () (其中 N 是按声明顺序对应的属性)
就像函数一样,也可以指定默认值:
data class User(var firstname: String = "Joe", var lastname: String = "Bloggs", var age: Int = 20)
过滤列表
val list = listOf(1,2,3,4,5,6)
// filter out even numbers
val even = list.filter { it % 2 == 0 }
println(even) //returns [2,4]
委托给一个类而不在公共构造函数中提供它
假设您想委托给一个类,但您不想在构造函数参数中提供委托给的类。相反,您想私下构造它,使构造函数调用者不知道它。起初,这似乎是不可能的,因为类委托只允许委托给构造函数参数。但是,有一种方法可以做到这一点,如this answer所示:
Kotlin
class MyTable private constructor(table: Table) : Table by table
{
// or a different type of table if desired
constructor() : this(TreeBasedTable.create())
}
Kotlin
class MySpecialCase : Serializable{
companion object{
private const val serialVersionUID : Long = 123
}
}
Kotlin
class MySpecialCase : Serializable {
companion object {
private val serialVersionUID: Long = 123
}
}
Kotlin
class MySpecialCase : Serializable {
companion object {
@JvmStatic private val serialVersionUID: Long = 123
}
}
Kotlin
fun doSomething() {
someOtherAction()
return this
}
Kotlin
fun T.fluently(func: ()->Unit): T {
func()
return this
}
Kotlin
fun doSomething() {
return fluently { someOtherAction() }
}
Kotlin
val str = "foo"
str.let {
println(it)
}
Kotlin
val str: String? = someFun()
str?.let {
println(it)
}
Kotlin
fun makeDir(String path): File {
val result = new File(path)
result.mkdirs()
return result
}
有了这个,你可以像这样调用 MyTable 的构造函数:MyTable()。 MyTable 委托的 Table
Kotlin 中的可序列化和 serialVersionUid
要在 Kotlin 中为类创建 serialVersionUID,您有几个选项都涉及向类的伴随对象添加成员。最简洁的字节码来自一个私有的 const Val,它将成为包含类的私有静态变量,在本例中为 MySpecialCase:
科特林
class MySpecialCase : Serializable{
companion object{
private const val serialVersionUID : Long = 123
}
}
您也可以使用这些形式,每个形式都有一个副作用,即具有序列化不需要的 getter/setter 方法。
科特林
class MySpecialCase : Serializable {
companion object {
private val serialVersionUID: Long = 123
}
}
这会创建静态字段,但也会在伴生对象上创建一个 getter 以及 getSerialVersionUID,这是不必要的。
科特林
class MySpecialCase : Serializable {
companion object {
@JvmStatic private val serialVersionUID: Long = 123
}
}
这会创建静态字段,但也会在包含类 MySpecialCase 上创建静态 getter 以及 getSerialVersionUID,这是不必要的。但所有这些都是将 serialVersionUID 添加到 Serializable 类的方法。
Kotlin 中的流利方法
Kotlin 中的 Fluent 方法可以与Java相同:
科特林
fun doSomething() {
someOtherAction()
return this
}
但是您也可以通过创建扩展函数来使它们更具功能性,例如:
科特林
fun T.fluently(func: ()->Unit): T {
func()
return this
}
然后允许更明显流畅的功能:
科特林
fun doSomething() {
return fluently { someOtherAction() }
}
在 Kotlin 中,使用 let 或也可以简化可空对象的处理,let 从调用它的对象创建本地绑定。例子:
科特林
val str = "foo"
str.let {
println(it)
}
这将打印“ foo ”并返回Unit 。
- let 和also 之间的区别在于您可以从 let 块返回任何值。另一方面,也将始终返回Unit 。
- 现在为什么这很有用,你问?因为如果你调用一个可以返回 null 的方法,并且你只想在返回值不为 null 时运行一些代码,你可以使用 let 或者像这样:
科特林
val str: String? = someFun()
str?.let {
println(it)
}
这段代码只会在 str 不为空时运行 let 块。注意空安全运算符(?)
使用 apply 来初始化对象或实现方法链接
申请文件说明如下:
以这个值作为接收者调用指定的函数块并返回这个值。虽然 kdoc 不是那么有用,但apply确实是一个有用的函数。用外行的话来说, apply建立了一个范围,在这个范围内this绑定到您调用的对象上apply 。当您需要在一个对象上调用多个方法时,这使您可以节省一些代码,然后您将稍后返回。
例子:
File(dir).apply { mkdirs() }
这和写这个是一样的:
科特林
fun makeDir(String path): File {
val result = new File(path)
result.mkdirs()
return result
}