今現在「初めてのアンドロイドプログラミング」という書籍で、kotlinの勉強をしております。
fun doLambda(x: Int, l:(Int) -> Int) = l(x)
doLambda(5, {it*2})
結果は10となります。
第一引数に受け取る値、第2引数に関数型で戻り値と受け取る値はInt型ですよと明示していると思われるのですが、
= l(x)っというのはこの関数自体の返却値で、合っているのでしょうか?
あまり理解できていないので、説明がうまくできません。
どなたか教えていただけないでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
ラムダを利用する場合と利用しない場合
次のコードがラムダを利用せずに記述したものになります。
doLambda
に与えられたInt
をdouble
が2倍して返すだけです。
kotlin
1 fun double(i : Int) : Int { 2 return i * 2 3 } 4 5 fun doLambda(i : Int) : Int { 6 return double(i) 7 }
次のコードが double
をラムダで渡すようにしたものになります。
kotlin
1 fun doLambda(i: Int, l: (Int) -> Int): Int { 2 return l(i) 3 } 4 5 fun main() { 6 doLambda(2, { it * 2 }) 7 }
というようにラムダを利用すると、doLamda
で実行する
処理の一部を呼び出し側でカスタマイズできるようになります。
kotlin
1 fun doLambda(i: Int, l: (Int) -> Int): Int { 2 return l(i) 3 } 4 5 fun main() { 6 doLambda(2, { it * it}) // 2倍ではなく2乗を計算したいから変更 7 }
冗長なコードがあるので、省略していく
上のコードのままでも特に動作には問題ありませんが、
少し冗長な記述があるので Kotlin の機能を利用して省略していきます。
単一式関数を利用すれば {} を省略できる
Kotlin では単一式関数という機能がサポートされているので、
関数に単一の式(1つの処理)のみ記述される場合は次のように{}を省略できます。
Kotlin
1 // Before 2 fun double(i : Int) : Int { 3 return i * 2 4 } 5 6 // After 7 fun double(i : Int) : Int = i * 2 8 9 fun main() { 10 doLambda(2, { it * 2 }) 11 }
単一式関数を利用すれば、戻り値を省略できる
また単一式関数で宣言されたとき、単一の式(1つの処理)の
戻り値の型が明確な場合には関数の戻り値を省略することができます。
kotlin
1 // Before 2 fun double(i : Int) : Int = i * 2 3 4 // After 5 fun double(i : Int) = i * 2 6 7 fun main() { 8 doLambda(2, { it * 2 }) 9 }
というように Kotlin の機能を駆使して、
冗長な記述を省略していくと次のコードになります。
Kotlin
1 fun double(i : Int) = i * 2 2 3 fun main() { 4 doLambda(2, { it * 2 }) 5 }
投稿2020/02/05 15:58
編集2020/02/05 16:00総合スコア19
0
第一引数に受け取る値、第2引数に関数型で戻り値と受け取る値はInt型ですよと明示していると思われるのですが、
= l(x)っというのはこの関数自体の返却値で、合っているのでしょうか?
はい、その解釈であっていると思います。
doLambdaの引数x
はInt型、引数l
は引数にIntを取りIntを返す関数型を表しています。
kotlin
1fun doLambda(x: Int, l: (Int) -> Int) = l(x)
この書き方を少し冗長化して書くと下記のようになります。
このコードから分かるように、doLambdaの戻り値はl
という関数の実行結果です。
kotlin
1fun doLambda(x: Int, l: (Int) -> Int): Int { 2 //Intを取り、Intを返すl関数を実行 3 return l(x) 4}
実行する式が単一式の場合、下記のようにreturnと{ }
を省略することができます。
kotlin
1fun doLambda(x: Int, l: (Int) -> Int): Int = l(x)
さらに戻り値の型が推論できる場合、戻り値の型も省略できます。(これは質問文に記載の関数と同じものです。)
kotlin
1fun doLambda(x: Int, l: (Int) -> Int) = l(x)
投稿2020/02/05 11:58
編集2020/02/06 07:00総合スコア1752
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/06 01:46
2020/02/06 11:39 編集
2020/02/09 03:19