1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

kotlinのラムダいろいろ(メモ)

Posted at

記事が参考になりそうな人

  • ラムダがよくわからんくなる人

変数に関数を格納する

fun foo(){
    println("Hello")
}

を変数に格納したいときは(関数を呼び出すんではない)

val aaa = ::foo

で格納できる
スクリーンショット 2023-01-17 21.00.56.png


funを使わず関数をつくる

"fun"を使わずに関数を定義するには

val foo = { println("Hello")}

スクリーンショット 2023-01-17 21.00.40.png

これは

foo()

で関数を呼べる


関数「型」

() -> Unit

とは、
「引数がない」し、「戻り値がない」関数"型"を表している
(Intとかの型と同じように、関数の型を書きたいときはこれ)

スクリーンショット 2023-01-17 20.51.45.png

応用

Int型2つの引数を受け取り、Int型が返ってくる関数は

(Int, Int) -> Int

つまり、例えば

val aaa:() -> Unit = {println("Hello")}


「aaa は引数なしの戻り値なしの関数のことですよ」で、

val cat:String = "猫"

と同じ見方

まとめるとこんな風に書ける

fun main() {
    val trueFunction = trickOrTreat(true)
    val falseFunction = trickOrTreat(false)
    trueFunction()
    falseFunction()
}

fun trickOrTreat(isTrick:Boolean):()->Unit{
    if(isTrick){
        return trick
    }else{
        return treat
    }
}

val trick = {println("trick")}
val treat = {println("treat")}

trick
treat
が返ってくる


引数に関数型を設定する

上のtrickOrTreat関数の引数を増やすと

fun trickOrTreat(isTrick:Boolean, extraTreat:(Int)->String):()->Unit{
    if(isTrick){
        return trick
    }else{
        println(extraTreat(5))
        return treat()
    }
}

訳:
trickOrTreatの第2引数が関数で、その関数っていうのはInt型を引数に持ってて、Stringが返ってくる
で、treat関数の引数にそのstringをつっこもう
(extraTreatって名前はここで付けた名前ってだけで、そういう名前の関数を用意しろ、もしくは絶対存在してるってことではない)

val coins:(Int) -> String = { number->
    "$number coins"
}

とかてきとーにつくってtrickOrTreat関数の第2引数としてつっこめばよい

fun main() {
    val coins:(Int)->String = { int ->
        "$int coins"
    }
    
    val cupcake:(Int)->String = {
        "cupcake"
    }
    
    val trueFunction = trickOrTreat(true, coins)
    val falseFunction = trickOrTreat(false, cupcake)
    trueFunction()
    falseFunction()
}

fun trickOrTreat(isTrick:Boolean, extraTreat:(Int)->String):()->Unit{
    if(isTrick){
        return trick
    }else{
        println(extraTreat(5))
        return treat
    }

簡単に書く

上の書き方をもっと簡単にしよう

まず

    val coins:(Int)->String = { int ->
        "$int coins"
    }

は、{}の中の"int"って明示的に書いたけど、別にわざわざ書かなくても良い→その場合はitになる

    val coins:(Int)->String = {
        "$it coins"
    }

次に、coinsって1回しか使われてないから直でつっこみたいな
これが

val trueFunction = trickOrTreat(true, coins)

こうなる

val trueFunction = trickOrTreat(true, {$it coins})

最後の引数が関数型ならその関数型を外に出せる

trickOrTreat関数みたいに、引数の最後が関数型なら外に出せる

val trueFunction = trickOrTreat(true){$it coins}

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?