サーチ…
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
}