Open7

Kotlinサーバーサイドプログラミング実践開発メモ

nopenope

スコープ関数

  • 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と異なり戻り値としてレシーバオブジェクト自体を返却する
nopenope

data classで自動生成されるメソッド

  • アクセサメソッド(setter, getter)
  • equals
  • hashCode
  • toString
  • componentN
  • copy
nopenope

ListとかMapとかってKotlinではImmutableなのか

nopenope

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
nopenope

拡張関数で柔軟にロジックを追加できる

この記法初めて知った

fun main() {
    println(12.square())
}

fun Int.square(): Int = this * this
144
nopenope

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>>が返却される