【第32章】forEachやラベル構文、filterついて詳しく解説

【第32章】forEachやfilter、ラベル構文について詳しく解説 基礎勉強
スポンサーリンク

この第32章では、プログラミング言語であるKotlinのforEachやラベル構文、filterについて一緒に勉強していきましょう。

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

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

リンコ
リンコ

こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、KotlinでのforEachやラベル構文、filterについて解説するピヨ!

前章ではラムダ式について勉強していきました。

この章では、ラムダ式で使える便利な「forEach」と「filter」という2つの「listの持っている関数」を勉強していこうと思います。
その際に、forEachで役に立つラベル構文というものも一緒に勉強していきます。

※ラムダ式について勉強したい方は、以下の記事を参考にしてください。

スポンサーリンク

【Kotlin】forEachとは?

forEachとは?

ではまずforEachから勉強していきましょう。そもそもforEachとはなんなのでしょうか?

繰り返しループ処理

forEachはKotlin側で予め用意されている関数で、要素の数だけ1つずつ順番に取り出して繰り返しループ処理を行うことです。

例えばラムダ式を使って配列の要素を1つずつ取得したい時や、リストの値に順番に数値を足していきたい時に使うことができます。

9章で勉強したforも同じ繰り返し処理ですが、違いについては後で勉強していきます。
※forについて勉強したい方は、以下の記事を参考にしてください。

配列やコレクションで使える

forEachは、12章から14章で勉強した配列やコレクションで使うことができます。

これだけ聞いてもよくわからないと思うので、実際にforEachのコードを見ていきましょう。

※配列、リスト、セットがわからない方は、以下の記事を参考にしてください。

リンコ
リンコ

配列やコレクションで使えるループ処理のことをforEachと言うピヨ!

【Kotlin】forEachを使ってみよう

forEachを使ってみよう

では実際にforEachを使って、どのようなものなのか勉強していきましょう。

ここでは、コレクションのリストを使ってforEachのコードを記述していきます。

サンプルコード

以下のサンプルコードでは、リストにいくつかの値を格納し、forEachを使って値を1つずつ取り出していきます。

forEachの使い方を見ながら、ラムダ式を使っていない場合、itを使っていない場合、ラムダ式とit両方使っている場合で、どれだけ簡潔になっているかも確認していきましょう。

fun main() {
    val letter = listOf("おはよう", "こんにちは", "こんばんは", "おやすみ")
    
    //ラムダ式を使っていない場合
    val a:(String) -> (Unit) = fun(x: String) {
        println(x)
    }
    letter.forEach(a)
    
    //ラムダ式を使っているがitを使っていない場合
    letter.forEach{a ->
        println(a)
    }
    
    //ラムダ式とit両方使っている場合
    letter.forEach{
        println(it)
    }
}

出力

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

おはよう
こんにちは
こんばんは
おやすみ
×3

このようにforEachを使うと、リストletterの値が繰り返し呼び出されて関数オブジェクトaに取り出され、1つ1つ処理されていくようになります。itを使っている場合は、暗黙的にitという変数に取り出されて処理されています。

またこう見るとラムダ式を使っていない場合から見ると、ラムダ式とit両方使っている場合の方が、格段に文字数が減り簡潔になっていることがわかりますね。

リンコ
リンコ

forEachは便利な機能ピヨね!

【Kotlin】forとforEachの違い

forとforEachの違い

forEachについて勉強したところで、ここでforとの違いを勉強していきましょう。

forとforEachの違いは?

forEachは関数

forとforEachの違いですが、forは構文に対してforEachは関数というところがあります。

この辺りは深く考えず、そうなんだくらいで覚えておきましょう。

breakやcontinueが使えない

こちらはしっかり理解しておく必要があるのですが、forEachではbreakやcontinueが使えません

なぜ使えないかと言うと、forは構文なのでbreakやcontinueという機能が設計されていますが、forEachは標準ライブラリでサポートされた関数だからです。

ではforEachでのループ処理から意図的に抜け出したい場合はどうすればいいでしょうか?

ラムダ式は匿名関数の一種です。抜け出したい時は関数で使える「return」を使います。しかしreturnを使うと、思わぬところでループ処理を抜け出してしまう場合があります。

リンコ
リンコ

forEachではbreakやcontinueが使えないので注意ピヨ!

returnを使ってみよう

returnを使うとどのようになるか、以下のコードを見てみましょう。

サンプルコード

以下のサンプルコードでは、リストnumsをforEachを使い繰り返しitに値を入れて、itが4の時returnします。

fun main() {
    val nums = listOf(1, 2, 3, 4, 5)
    
    nums.forEach{
        if(it == 4) return
        println(it)
    }
    println("4のみ出力されず、ラムダ式が終了しました")
}

出力

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

1
2
3

このコードでの出力は「123」で終わってしまいました。

関数でreturnを使う場合「returnと書いたその関数を抜けます」という意味になるのですが、ラムダ式の中でreturnを使うとラムダ式を抜けるのではなく、その上の関数を抜けてしまいます

このコードではforEachを抜けようとreturnを記述しましたが、main関数を抜け出してしまうので「4のみ出力されず、ラムダ式が終了しました」まで出力がされませんでした。

ではどうすればいいかと言うと、そのような時は「ラベル構文」を使います。ではラベル構文について軽く勉強していきます。

ラベル構文を使ってみよう

まずはさっそくラベル構文を使ったコードを記述していきましょう。

サンプルコード

以下のサンプルコードでは上記と基本的に同じですが、ラベル構文を使ってforEachを抜け出します。

fun main() {
    val nums = listOf(1, 2, 3, 4, 5)
    
    nums.forEach loop@{
        if(it == 4) return@loop
        println(it)
    }
    println("4のみ出力されず、ラムダ式が終了しました")
}

出力

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

1
2
3
5
4のみ出力されず、ラムダ式が終了しました

抜け出したい位置を「ラベル名@~@ラベル名」という風に記述すると「このreturnはこの関数を抜けるラベル構文ですよ」という意味になります。

こうすることで、自分で意図した位置で抜け出すことができます。このようにラベル構文はデフォルトの位置とは違う場所へ抜け出す時に使えます。

また以下のように、ラベル構文の名前はラムダ式を引数にする高階関数の名前にしてもオッケーです。

    nums.forEach {
        if(it == 4) return@forEach
        println(it)
    }

この方が、記述する文字数も少なくなりスッキリしますね。

リンコ
リンコ

ラベル構文を使うことで任意の位置に抜け出すことができるピヨ!

【Kotlin】filterとは?

filterとは?

続いて、filterという関数についても勉強していきましょう。filterとはなんでしょうか?

コレクションで使用できる

filterは、リストやセットやマップなどのコレクションで使える、標準ライブラリでサポートされた関数です。

コレクションから特定の要素を探し出す

コレクションに格納されている複数の要素から、任意の条件に当てはまる要素だけを探し出すのに使える関数です。

もっと詳しく言うと「ある要素を受け取り、Booleanの値を返す関数」というものです。

任意の条件を指定する際、ラムダ式を使用することが一般的になっています。

リンコ
リンコ

filterはコレクションから条件に当てはまる要素を取り出す関数ピヨ!

【Kotlin】filterを使ってみよう

filterを使ってみよう

なんとなくわかったところで、実際にfilterを使いながら勉強していきましょう。

ここでは、コレクションのセットを使ってfilterのコードを記述していきます。

サンプルコード

以下のサンプルコードでは、セットにいくつかの値を格納し、filterを使って偶数の値のみを抽出して表示します。

fun main() {
    val nums = setOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val evens = nums.filter { it % 2 == 0 }
    println(evens) 
}

出力

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

[2, 4, 6, 8, 10]

このコードではまず、filter関数にラムダ式を引き渡しています。

filterを使っている「nums.filter { it % 2 == 0 }」という箇所を解説すると、セットnumsの要素を1つずつラムダ式内にある「it % 2 == 0」の部分で計算をしています。

「要素を2で割って余りが0ならセットevensに格納する」ということになります。

リンコ
リンコ

標準ライブラリでサポートされている関数は便利なものが多いピヨ!

まとめ

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

  • forEachは要素の数だけ1つずつ順番に取り出して繰り返しループ処理を行うこと
  • forEachとラムダ式とitを使うと簡潔にコードが記述できる
  • forは構文に対してforEachは関数で、forEachではbreakやcontinueが使えない
  • ループ処理を任意の位置に抜け出したい時はラベル構文を使う
  • filterはある要素を受け取り、Booleanの値を返す関数

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

リンコ
リンコ

次回の記事では「maxByとminByやメンバ参照」について勉強していくピヨ!

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

コメント

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