サーチ…
DTOの作成(POJO / POCO)
kotlinのデータクラスは、データを保持するだけで実行するために作成されたクラスです。そのようなクラスはdata
としてマークされdata
:
data class User(var firstname: String, var lastname: String, var age: Int)
上記のコードはUser
クラスを作成し、次のコードを自動的に生成します:
- すべてのプロパティのゲッターとセッター(
val
のゲッターのみ) -
equals()
-
hashcode()
-
toString()
-
copy()
-
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]
公共のコンストラクタでクラスを提供せずにクラスに委譲する
あるクラスに委譲したいが、コンストラクターパラメーターにdelegated-toクラスを提供したくないとします。代わりに、それを非公開にして、コンストラクタの呼び出し元にそれを知らさないようにしたいとします。最初は、クラス委譲でコンストラクタパラメータのみを委譲できるため、これは不可能に思えるかもしれません。しかし、 この答えにあるように、それを行う方法があります :
class MyTable private constructor(table: Table<Int, Int, Int>) : Table<Int, Int, Int> by table {
constructor() : this(TreeBasedTable.create()) // or a different type of table if desired
}
これでMyTable
のコンストラクタをMyTable()
ように呼び出すことができます。 MyTable
代理するTable<Int, Int, Int>
、私的に作成されます。コンストラクターの呼び出し元は何も知らない。
この例はこのSOの質問に基づいています。
KotlinのSerializableとserialVersionUid
KotlinでクラスのserialVersionUID
を作成するには、クラスのコンパニオンオブジェクトにメンバーを追加するといういくつかのオプションがあります。
最も簡潔なバイトコードは、格納するクラス(この場合はMySpecialCase
プライベート静的変数になるprivate const val
からMySpecialCase
ます。
class MySpecialCase : Serializable {
companion object {
private const val serialVersionUID: Long = 123
}
}
これらのフォームを使用することもできます。これらのフォームはそれぞれ直列化のために必要でないゲッター/セッターメソッドを持つという副作用を伴います。
class MySpecialCase : Serializable {
companion object {
private val serialVersionUID: Long = 123
}
}
これにより、静的フィールドが作成されますが、 getSerialVersionUID
も不要なコンパニオンオブジェクトに作成されます。
class MySpecialCase : Serializable {
companion object {
@JvmStatic private val serialVersionUID: Long = 123
}
}
これにより、静的フィールドが作成されますが、静的ゲッターとgetSerialVersionUID
が含まれているクラスMySpecialCase
にも不要ですが作成されます。
しかし、すべてはserialVersionUID
をSerializable
クラスに追加する方法として機能します。
Kotlinの流暢なメソッド
Kotlinの流暢なメソッドは、Javaと同じにすることができます:
fun doSomething() {
someOtherAction()
return this
}
ただし、次のような拡張機能を作成することで、より機能的にすることもできます。
fun <T: Any> T.fluently(func: ()->Unit): T {
func()
return this
}
より明確な流暢な関数を可能にする:
fun doSomething() {
return fluently { someOtherAction() }
}
letを使用するか、ヌル可能オブジェクトの操作を簡略化する
let
Kotlinにそれは時に呼び出されたオブジェクトからバインディングローカルを作成します。例:
val str = "foo"
str.let {
println(it) // it
}
これは"foo"
、 Unit
を返します。
違いlet
とalso
あなたから任意の値を返すことができるということであるlet
ブロック。 also
、一方では常にUnit
をreutrnします。
なぜこれが便利なのですか? null
を返すことができるメソッドを呼び出すと、その戻り値がnull
でない場合にのみいくつかのコードを実行したい場合、 let
を使うlet
also
できますlet
、次のようにすることalso
できます:
val str: String? = someFun()
str?.let {
println(it)
}
このコードは、 str
がnull
でない場合にのみlet
ブロックを実行しnull
。 null
安全演算子( ?
)に注意してください。
適用を使用してオブジェクトを初期化するか、メソッド連鎖を実現する
apply
の文書には、次のように記載apply
ています。
指定された機能ブロックを呼び出し
this
、その受信機のような値を返すとthis
値は。
KDOCはそれほど有用ではありませんがapply
確かに便利な機能です。素人の面ではapply
れる範囲を確立this
あなたが呼ばれるオブジェクトにバインドされているapply
上を。これにより、あるオブジェクトに対して複数のメソッドを呼び出す必要が生じたときに、そのオブジェクトを後で返すときにいくつかのコードを用意することができます。例:
File(dir).apply { mkdirs() }
これはこれを書いているのと同じです:
fun makeDir(String path): File {
val result = new File(path)
result.mkdirs()
return result
}