😀

Kotlin の Result 型の fold について

2025/02/19に公開

Result 型の fold は、成功と失敗の両方のケースを一度に扱うための便利なメソッドです。

基本的な考え方

Result は、ある処理が成功したか失敗したかを表現するための型です。

  • 成功時: 正常な値が格納されている
  • 失敗時: 例外(Throwable)が格納されている

fold メソッドは、このどちらの場合にも対応できるように、2 つのラムダを受け取ります。

シグネチャ

public inline fun <R> Result<T>.fold(
    onSuccess: (value: T) -> R,
    onFailure: (exception: Throwable) -> R
): R
  • onSuccess: 成功時に呼ばれ、成功時の値 (T) を受け取って結果 (R) を返す関数
  • onFailure: 失敗時に呼ばれ、例外 (Throwable) を受け取って結果 (R) を返す関数

どちらの場合も、最終的に同じ型 R の値に変換して返します。

使い方の例

以下は、Result<Int> 型の値を fold で処理する例です:

fun processResult(result: Result<Int>): String {
    return result.fold(
        onSuccess = { value -> "成功: 値は $value です" },
        onFailure = { exception -> "失敗: エラーが発生しました (${exception.message})" }
    )
}

この例では、result が成功なら数値を使ってメッセージを作り、失敗なら例外メッセージを使って別のメッセージを返します。

まとめ

  • 簡潔に両方のケースを処理できる
    fold を使うことで、成功時と失敗時の処理を一つの呼び出しでまとめて書けます。

  • 結果を統一された型に変換できる
    成功でも失敗でも、最終的に同じ型 R の結果に「畳み込む(fold)」ので、後続の処理が楽になります。

fold は、エラーハンドリングをシンプルに記述したい場合に非常に有用です。

Discussion