Open7
Kotlinサーバーサイドプログラミング実践開発メモ
スコープ関数
- with
- 引数にレシーバオブジェクトを取り、それに対して処理を繰り返す
- thisは省略可能
val hogeMutableList = with(mutableListOf<Int>()) {
this.add(1)
}
- run
- レシーバオブジェクトに対しての拡張関数として処理をする
- withと同様にthisは省略可能
val hogeMutableList = mutableListOf<Int>().run {
this.add(1)
}
- let
- runに似ているが、thisを別の名前に変えて実行できる
val hogeMutableList = mutableListOf<Int>().let { tempMutableList ->
tempMutableList.add(1)
}
- apply
- runと異なり戻り値としてレシーバオブジェクト自体を返却する
- also
- letと異なり戻り値としてレシーバオブジェクト自体を返却する
data classで自動生成されるメソッド
- アクセサメソッド(setter, getter)
- equals
- hashCode
- toString
- componentN
- copy
今更だけどこのサイトで実行できる
ListとかMapとかってKotlinではImmutableなのか
classだとオブジェクト参照先のハッシュ値が比較で使用されるため、値が同じでもfalseが返ってくる
fun main() {
val user1 = User(1, "test")
val user2 = User(1, "test")
val dataUser1 = DataUser(1, "test")
val dataUser2 = DataUser(1, "test")
println(user1 == user2)
println(dataUser1 == dataUser2)
}
class User(val id: Int, val name: String)
data class DataUser(val id: Int, val name: String)
false
true
拡張関数で柔軟にロジックを追加できる
この記法初めて知った
fun main() {
println(12.square())
}
fun Int.square(): Int = this * this
144
associateByとgroupByの違い
fun main() {
val list = listOf(User(1, "alice"), User(2, "bob"), User(1, "carol"))
val map = list.associateBy{ it.id }
println(map)
}
data class User(val id: Int, val name: String)
{1=User(id=1, name=carol), 2=User(id=2, name=bob)}
キーが重複する場合末尾が優先され、Map<Int, User>が返却される
fun main() {
val list = listOf(User(1, "alice"), User(2, "bob"), User(1, "carol"))
val map = list.groupByTo(By{ it.id }
println(map)
}
data class User(val id: Int, val name: String)
{1=[User(id=1, name=alice), User(id=1, name=carol)], 2=[User(id=2, name=bob)]}
Map<Int, List<User>>が返却される