【第31章】ラムダ式について詳しく解説

【第31章】ラムダ式について詳しく解説 基礎勉強
スポンサーリンク
リンコ
リンコ

こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、Kotlinでのラムダ式を記述する方法を解説するピヨ!

この第31章では、プログラミング言語であるKotlinのラムダ式について、一緒に勉強していきましょう。

この記事を読めばプログラミング未経験の方も、Kotlin入門レベルのラムダ式について1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。

※この記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。

スポンサーリンク

【Kotlin】ラムダ式とは?

ラムダ式とは?

ラムダ式は、Kotlinに限らず他のプログラミング言語でも使う用語です。

ラムダ式がどのようなものかというと、前章で勉強した匿名関数の記述方法をより簡潔にし、文字量を格段に減らせるようにしたものです。
プログラマーがコーディングする量が減るので、ラムダ式を使うとかなりの労力の削減になるというメリットがあります。

ただし、コーディングした人とは別の人が見た時に、情報量が減るというデメリットもあるので、少し注意が必要です。
あまりラムダ式の理解ができていないと記述を読んだときにチンプンカンプンになるので、しっかりと理解できるように勉強していきましょう。

リンコ
リンコ

ラムダ式は匿名関数の記述をさらに簡潔にしたものピヨ!

【Kotlin】ラムダ式を使うとどうなるか使う前と比べてみよう

ラムダ式を使うとどうなるか使う前と比べてみよう

ラムダ式がどんなものかなんとなくわかったところで、実際に記述方法などを勉強し、使うとどれくらい簡潔になるのか比べていきましょう。

ラムダ式を使う前のコード

まずは、ラムダ式を使う前のコードを見ていきます。

サンプルコード

以下のサンプルコードは、前章でも勉強した足し算と引き算を行うコードになります。

fun main(){
    val value1 = getValue("plus")
    val value2 = getValue("minus")
    println(value1(100, 50))
    println(value2(50,25))
}

fun getValue(a: String) : (Int, Int) -> Int {
    val p: (Int, Int) -> Int = fun(num1: Int, num2: Int) = num1 + num2
    val m: (Int, Int) -> Int = fun(num1: Int, num2: Int) = num1 - num2
    val value = when(a) {
        "plus" -> p
        else   -> m
    } 
    return value
}

出力

サンプルコードを実行すると、以下のように出力されます。

150
25

問題なく出力されますね。では以下からはラムダ式の書式を勉強して、上記のコードをラムダ式を使って書き直していきます。

ラムダ式の書式

ラムダ式の書式は以下のようになります。

{ 引数 -> 関数の本体や処理内容 }

「{}」で囲う

ラムダ式は「{}」で囲ってコードを記述します。「{}」で囲われたコードが、ラムダ式と判断されます

「->」を使う

ラムダ式では「->」を記述し、その左側に無名関数が受け取る変数名(引数)を記述し、右側に関数が返す値(関数の本体)を記述するルールになっています。

リンコ
リンコ

ラムダ式では「{}」や「->」といった記号を使うピヨ!

実際にラムダ式を使ってみよう

では実際にラムダ式を使って、上記のラムダ式を使う前のコードからどれくらい簡潔になっているか見ていきましょう。

サンプルコード

以下のサンプルコードは、上記の足し算と引き算を行うコードですが、ラムダ式を使ったコードになります。

fun main(){
    val value1 = getValue("plus")
    val value2 = getValue("minus")
    println(value1(100, 50))
    println(value2(50,25))
}

fun getValue(a: String) : (Int, Int) -> Int {
    val p: (Int, Int) -> Int = {num1,num2 -> num1 + num2}
    val m: (Int, Int) -> Int = {num1,num2 -> num1 - num2}
    val value = when(a) {
        "plus" -> p
        else   -> m
    } 
    return value
}

出力

サンプルコードを実行すると、以下のように出力されます。

150
25

ラムダ式を使っても、同じように出力されましたね。

ラムダ式を使う前の「fun(num1: Int, num2: Int) = num1 + num2」というコードが「{num1,num2 -> num1 + num2}」とスッキリしました。

この「{num1,num2 -> num1 + num2}」というラムダ式の中には、num1とnum2が何の型なのかは記述されていませんが、エラーにはなっていません。

これはラムダ式が代入される「p」や「m」という変数の型が「 (Int, Int) -> Int」という型になっていて、それをKotlinのコンパイラが型推論してくれている為、エラーにならず簡潔なラムダ式のコードになっているのです。

リンコ
リンコ

ラムダ式を使うとコードがスッキリするピヨ!

【Kotlin】ラムダ式を関数のパラメータとして記述してみよう

ラムダ式を関数のパラメータとして記述してみよう

ここまでは、ラムダ式を関数の本体に記述していました。しかしラムダ式は、関数のパラメータとしても記述することができます。

ここからは関数のパラメータとしてラムダ式を使う勉強をしていきます。

ラムダ式を関数のパラメータとして記述する基本の形

ラムダ式を関数のパラメータとして記述する際、いくつかの記述方法があります。

まずは、基本の形の記述方法を勉強していきます。

サンプルコード

以下のサンプルコードでは、関数へ引き渡すパラメータとしてラムダ式を記述しています。

fun main(){
    getValue({num1, num2 -> num1+num2})
}

fun getValue(a: (Int, Int) -> Int) {
    val value = a(100, 50)
    println(value)
}

出力

サンプルコードを実行すると、以下のように出力されます。

150

このコードでは「getValue関数」のパラメータとして「{num1, num2 -> num1+num2}」というラムダ式が記述されています。

このラムダ式がパラメータとして「getValue関数」のパラメータの「a」という変数に引き渡されました。

変数aは「(Int, Int) -> Int) 」という型の関数を受け取るように定義されているので、ラムダ式の「num1」と「num2」は「Int型」に違いないと解釈されます。

ラムダ式を簡潔に関数のパラメータとして記述

続いてラムダ式を関数のパラメータとして、より簡潔に記述していきます。

サンプルコード

以下のサンプルコードでは、上記とは別の2パターンのラムダ式の記述方法を使っています。

fun main(){
    getValue(){num1, num2 -> num1+num2}  //1つ目のパターン
    getValue{num1, num2 -> num1+num2}    //2つ目のパターン
}

fun getValue(a: (Int, Int) -> Int) {
    val value = a(100, 50)
    println(value)
}

出力

サンプルコードを実行すると、以下のように出力されます。

150
150

今までのラムダ式の記述では、関数にパラメータを引き渡す際に呼び出し側の「()」の中に値を入れていました。

    getValue(){num1, num2 -> num1+num2}  //1つ目のパターン

しかし1つ目のパターンでは「()」の外側にラムダ式を記述しています。これはKotlinのルールで、「ラムダ式が関数の受け取る最後のパラメータの場合のみ、()の外側にラムダ式を記述して良い」となっているからです。

このように記述することで、基本の形よりスッキリした見栄えになっていますよね。

    getValue{num1, num2 -> num1+num2}    //2つ目のパターン

続いて2つ目のパターンでは、関数名の後ろにある「()」がなくなっています

基本的に関数名の後ろの「()」は付けるようになっていますが、Kotlinのルールで「ラムダ式が関数の受け取る唯一のパラメータの場合のみ()を省略して良い」となっています。

特にこの「()」を省略する記述方法は多用されているので、必ず覚えるようにしましょう。

リンコ
リンコ

どんどん記述を省略できるピヨ!

【Kotlin】ラムダ式が受け取るパラメータが1つの場合はさらに簡潔に記述できる

ラムダ式が受け取るパラメータが1つの場合はさらに簡潔に記述できる

ここまではパラメータを2つ受け取るラムダ式で勉強していきましたが、パラメータが1つの場合のラムダ式は、さらに記述を簡潔にすることができます。

早速コードを見て勉強していきましょう。

サンプルコード

以下のサンプルコードでは、名前をパラメータとして引き渡し「くん」とくっつけるコードです。

fun main(){
    val value1: (String) -> String = {a -> a + "くん"}
    val value2: (String) -> String = {it + "くん"}
    println(value1("リンコ"))
    println(value2("ここまる"))
}

出力

サンプルコードを実行すると、以下のように出力されます。

リンコくん
ここまるくん

上記で勉強したラムダ式を使用していますが、1つ目の「value1」に代入しているラムダ式では既に勉強したコードのままですね。

2つ目の「value2」に代入しているラムダ式では「{it + “くん”}」と記述されていて「it」が使われています。この「it」は、受け取るパラメータが1つしかないラムダ式を記述する際に使うことができる特別なものです。

この「it」を使うことで、1つ目のコードよりも簡潔なコードになっています。

「it」は英語で「それ」を意味する単語です。ですのでこのコードでは「それにくんを付けて文字列を作ります」というラムダ式になります。

私たちの会話でも「それ」という抽象的なことを指す言葉を使い、文脈を読んで「それ」が何か理解しながら話すことがあると思いますが、Kotlinでもこのような感じで「it(それ)」を使い文脈を読んでくれるおかげで、より簡潔なコードを記述することができます。

リンコ
リンコ

「it(それ)」を使うことでさらにコードが簡潔になるピヨ!

まとめ

この記事では、プログラミング言語であるKotlinのラムダ式について勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。

  • ラムダ式は匿名関数の記述を、より簡潔にしたもの
  • 「->」を記述し、その左側に匿名関数が受け取る引数、右側に関数が返す値を記述する
  • ラムダ式が関数の受け取る唯一のパラメータの場合のみ()を省略してOK
  • 受け取るパラメータが1つの場合「it(それ)」を使い、さらにコードを簡潔にできる

今回勉強した「ラムダ式」は難しくややこしいと思うので、何回も読み直してしっかり覚えておきましょう。

リンコ
リンコ

次回の記事では「forEachやラベル構文、filter」について勉強していくピヨ!

プログラミング未経験の方や入門レベルの方、Kotlinについて詳しくなりたい方は、また一緒に勉強するピヨ!

コメント

タイトルとURLをコピーしました