📜  Kotlin 中的成语

📅  最后修改于: 2022-05-13 01:54:31.003000             🧑  作者: Mango

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 将被私下创建。构造函数调用者对此一无所知。这个例子是基于这个 SO question

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 。当您需要在一个对象上调用多个方法时,这使您可以节省一些代码,然后您将稍后返回。

例子:

这和写这个是一样的:

科特林

fun makeDir(String path): File {
  val result = new File(path)
  result.mkdirs()
  return result
}