kotlinのlet run also applyの使い方についてのサンプルをずらずらと書いてみた。



//あらかじめ変数宣言
var test1: Int? = null
var test2: Int? = 10

//let nullじゃないときに実行するとかが可能
var test3: String = ""
test2?.let {test3 = "Not Null 1"}

//let leyは最後に実行された関数の値を返すことが可能
var test4 = test2?.let {"Not Null 2"}

//let nullじゃないときに自身に代入できる
test2?.let { test2 = 3 }

//let 自分自身はitでアクセスできるがvalなので変更不可 thisは使えない
var test5 = test2?.let { (it + 3).toString() }

//let 結果を返さないときは何も返さない(Unitを返す)
var test6 = test2?.let { test2 = 3 }

//let nullの時にはnullを返す
var test7: Int? = test1?.let { 9 }

//let nullの時に返値を返すことができる
var test8: Int = test1?.let { 9 } ?: 10

//let 変数がnullの時にrunを実行するとかができる
var test9: Int = 0;
test1?.let { test9 = 1 } ?: run { test9 = 2  }

//also の場合はほとんどletと同じ。ただし、letが最後に実行した関数の返値が返るのではなく、そのオブジェクトそのものが帰る

//run 自分自身に対する操作が可能
var test10: Int = 0;
test10.run{test10 = 2}

//run 返値はない
var test11 = test10.run{test10 = 2}

//run 返値を持つ、自分自身をthisで表現できる
var test12 = test10.run{this + 2}

//run まとめて操作するのに向いている 返値も得られる
class testClass {
    var num: Int = 0
    fun add(): Int = num++
}
var test13:Int = testClass().run {
    add()
    add()
    add()
}

//aplly 自分自身に対する操作が可能
test10.apply {test10 = 99}

//apply letとalsoの関係のように、runは最後に実行された関数の返値が返るが、alsoは必ず自分自身のオブジェクトが返る
var test14: testClass = testClass().apply {
    add()
    add()
    add()
}

//withもあるけど、ほぼ上記の使い方で問題ないので必要なさそう
//もっというと、letとalsoだけでも問題ないのでは?