質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

2142閲覧

Kotlin ラムダ式と関数型について

kbayashi

総合スコア18

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

1グッド

0クリップ

投稿2020/02/05 09:45

今現在「初めてのアンドロイドプログラミング」という書籍で、kotlinの勉強をしております。

fun doLambda(x: Int, l:(Int) -> Int) = l(x)
doLambda(5, {it*2})

結果は10となります。
第一引数に受け取る値、第2引数に関数型で戻り値と受け取る値はInt型ですよと明示していると思われるのですが、
= l(x)っというのはこの関数自体の返却値で、合っているのでしょうか?

あまり理解できていないので、説明がうまくできません。
どなたか教えていただけないでしょうか?

keicha_hrs👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ラムダを利用する場合と利用しない場合

次のコードがラムダを利用せずに記述したものになります。
doLambdaに与えられたIntdoubleが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
kaleidot725

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kbayashi

2020/02/06 01:46

ラムダ式を利用しない場合と利用する場合のコード、さらにラムダ式で単一の式の場合はコードを簡潔にできることを丁寧に解説していただき、ありがとうございました。 ちなみに質問なんですが、kotlinでは関数を定義するときは、基本ラムダ式を利用するんですか?
kaleidot725

2020/02/06 11:39 編集

> kotlinでは関数を定義するときは、基本ラムダ式を利用するんですか? 普通の関数の定義して利用するのが基本だと思いますよ。 ラムダ式を利用すると確かに便利なシチュエーションはありますが、 特に Kotlin を学びはじめのときは使う必要がないかな〜と思っています。
kbayashi

2020/02/09 03:19

返信ありがとうございます。 とりあえず普通の関数で色々作ってみて慣れてきたら使おうと思います~
guest

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
rubytomato

総合スコア1752

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kbayashi

2020/02/06 02:00

解説ありがとうございます。ラムダ式を利用した関数は利用しない場合と比べ、コードが簡潔になるのが良いですね。関数を定義する時はラムダ式を用いて定義していこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問