🪡

Kotlin の let を使って一時的な変数を減らす

2023/03/29に公開

はじめに

このブログ記事では、Kotlin の let を使うことで一時的な変数を減らすことができる、という使い方について紹介できればと思います。

具体例

例えば csv ファイルを読み込んであるクラスに変換したいとします。
手続き的にプログラミングした一例として、下記のようなコードがあるとします。

val csvPath = System.getenv("CSV_PATH")
requireNotNull(csvPath)

val csvFile = File(csvPath)
if (csvFile.exists().not()) throw IllegalArgumentException()

val csvData = csvReader().readAll(csvFile)
val data = SomeClass(csvData.drop(1)) // ヘッダー行の削除

最終的に欲しいデータは data だけなのですが、途中で csv 用の変数をいくつか定義しており、認知コストが割かれます。
これを let を使うと下記のように書くことができます。

val data = System
    .getenv("CSV_PATH")
    .let(::requireNotNull)
    .let(::File)
    .also { require(it.exists()) }
    .let { csvReader().readAll(it) }
    .drop(1) // ヘッダーの削除
    .let(::SomeClass)

こうすることで、寿命の短い一時的な変数を気にすることなく処理を記述することができます。

考え方

考え方としては let はパイプ演算子と考えてよいと思います。
let は引数が 1 つの method reference を渡すと it を引数として実行される[1]ので簡潔に書くことができます。

おわりに

let をつなげることで考える状態が減り、処理の流れに集中することができるので、個人的にはこういう書き方ができるとわかってよかったです。

脚注
  1. Scope functions | Kotlin Documentation ↩︎

ROUTE06 Tech Blog

Discussion