HOWTO · Kotlin

Kotlin flatMap() 関数

このチュートリアルでは、flatMap 関数の仕組み、Kotlin での flatMap 関数と Map 関数の違いについて説明します。

このページの内容

アプリケーションを開発するときは、アプリケーション全体で常にコレクション フレームワークを使用します。 リストがある場合は、コレクションとやり取りしています。

コレクションを使用して、関連するデータをメモリに一時的に保存し、データに対してさまざまな計算を実行します。 たとえば、コレクションは、データベースまたはファイルからデータ サイズを見つけるのに役立ちます。

Java 8 でストリームが導入される前は、開発者が命令型プログラミング アプローチを使用していたため、これらの計算を実装するのは非常に困難でした。

stream API は、コードが宣言型プログラミング アプローチを使用するため、コレクションを使用した計算の実装を非常に簡単にしました。

Kotlin では、filter()、map()、flatMap() など、stream API で使用されるのと同じメソッドでこのプログラミング アプローチを使用することもできます。

このチュートリアルでは、Kotlin で flatMap() 関数がどのように機能するか、および flatMap() 関数と map() 関数の違いを学びます。

Kotlin で map() 関数を使用する際のよくある落とし穴

map() 関数を使用する場合、2つのリストを操作した後で 1つのリストを取得することを決定するかもしれませんが、関数は単一のリストを返しません。

これは、map() メソッドを使用する際によくある問題です。 次のセクションでは、問題がどのように発生するかを示します。

IntelliJ 開発環境を開き、File > New > Project を選択します。 プロジェクト name を kotlin-flatmap として入力し、Language セクションで Kotlin を選択し、Build system セクションで Intellij を選択します。

kotlin フォルダーの下に Main.kt ファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

val stringArray = arrayOf("Harry", "potter");

fun getUniqueCharacters(): List<List<String>> {
    return stringArray.map { word -> word.split("") }
        .distinct()
        .toList();
}

fun main(){
    println(getUniqueCharacters());
}

このチュートリアルで取り上げるすべての例の目的は、上記のように、2つの文字列を持つ配列から個別の文字を含む単一のリストを返すことです。

お気づきのように、getUniqueCharacters() メソッドは、map() 関数の戻り型であるリスト List<List<String>> のリストを返します。

map() 関数は、目的に反する 2つの異なるリストを含むリストを返します。 以下に示すように、コードを実行して、map() 関数が 2つの異なるリストを返すことを確認します。

[[, H, a, r, r, y, ], [, p, o, t, t, e, r, ]]

Kotlin flatMap() 関数

前の例をコメントアウトし、次のコードをコピーして Main.kt ファイルに貼り付けます。

val stringArray = arrayOf("Harry", "potter");

fun getUniqueCharacters(): List<String> {
    return stringArray.map { word -> word.split("") }
        .flatMap { it }
        .distinct()
        .toList();
}

fun main(){
    println(getUniqueCharacters())
}

getUniqueCharacters() 関数は、flatMap() 関数の戻り型である文字列を含むリストを返します。

flatMap() は、split() メソッドを使用して配列を個々の文字に変換することにより、一意の要素を含む単一のリストを返します。 distinct() メソッドは、返されるリストに一意の文字が含まれていることを確認します。

上記のコードを実行して、一意の文字結果を含む単一のリストを確認します。

[, H, a, r, y, p, o, t, e]

Kotlin の flatMap() 関数の代替

前の例をコメントアウトし、次のコードをコピーして Main.kt ファイルに貼り付けます。

val stringArray = arrayOf("Harry", "potter");

fun getUniqueCharacters(): List<String> {
    return stringArray.map { word -> word.split("") }
        .flatten()
        .distinct()
        .toList()
}

fun main(){
    println(getUniqueCharacters())
}

この例では、flatMap() 関数に似た flatten() 関数を使用しました。 flatten() 関数は、既存のすべてのコレクション要素を 1つのリストに追加して、1つのリストを返します。

この例を実行して、配列からすべての一意の文字を含む単一のリストが返されることを確認します。

[, H, a, r, y, p, o, t, e]

まとめ

このチュートリアルでは、複数のコレクションから単一のリストを返したい場合に flatMap() 関数がどのように機能するかを学びました。 また、同じ目的を達成するために map() メソッドを使用することの欠点も学びました。

Kotlin で他の関数がどのように機能するかについて詳しく知りたい場合は、この Kotlin ドキュメント にアクセスしてください。関数について詳しく説明されています。