OptionとNullable:それぞれを使う場面
ArrowのOption型とKotlinのnullable型を比較し、適切な方を選択します。
「OptionとNullable:それぞれを使う場面」はCoddyKit上の無料Kotlin Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはKotlin Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Kotlin Academyコースには全4レッスンが含まれています。
不在を表す2つの方法
Kotlinのnull許容型
KotlinのT?は、ほとんどのKotlinコードで不在を表す慣用的な選択肢です。コンパイラーがnullチェックを強制し、安全呼び出し演算子?.で呼び出しを自然に連結でき、?: "default"でフォールバックを簡潔に指定できます。
val name: String? = findUser(id)?.name
val display = name ?: "Anonymous"ArrowのOption<A>
import arrow.core.Option
import arrow.core.Some
import arrow.core.None
import arrow.core.toOption
val opt: Option<String> = "hello".toOption() // Some("hello")
val absent: Option<String> = NoneOptionとnull許容型の相互変換
相互に自由に変換できます。value?.toOption()はnull許容値をOptionでラップし、option.getOrNull()は値を取り出してnullを返し、option.getOrElse { default }はフォールバックを提供します。
val opt: Option<String> = nullableString.toOption()
val back: String? = opt.getOrNull()Optionに対するmapとflatMap
map { }はSomeの値を変換します(Noneはそのまま返します)。flatMap { }は、それ自体がOptionを返す処理を連結します。
val length: Option<Int> = "hello".toOption().map { it.length } // Some(5)
val noneLength: Option<Int> = (null as String?).toOption().map { it.length } // NoneOptionに対するfilter
filter { predicate }は、述語がfalseの場合にSomeをNoneへ変換します。
val positiveAge: Option<Int> = 25.toOption().filter { it > 0 } // Some(25)
val rejectedAge: Option<Int> = (-1).toOption().filter { it > 0 } // Nonefold:Optionを処理する
fold(ifEmpty, ifSome)を使用すると、パターンマッチングを使わずに1つの式で両方のケースを処理できます。
val result: String = someOption.fold(
ifEmpty = { "Nothing here" },
ifSome = { value -> "Got: $value" }
)null許容型T?を優先する場合
Kotlinのnull許容型(T?)は、次のような場合に適しています。
- ほかの開発者が読む、慣用的なKotlinコードを記述している
- null安全な演算子チェーン(
?.、?:)が必要である - Arrowを使用しないAPIで型を使用する
- パフォーマンスが重要である(ボクシングのオーバーヘッドがない)
Option<A>を優先する場合
次のような場合はOptionが適しています。
- すでにArrowの関数型パイプライン(
map、flatMap)を使用している - 省略可能な値を
EitherまたはRaiseと組み合わせたい - 汎用的な関数型コンテキストで不在を明示したい
- 呼び出し側がKotlinを使わない可能性のあるライブラリを構築している
either { }内でOptionを使う
Arrowのeither { }ブロック内では、まずOptionをEitherに変換してから、その値に対して.bind()を呼び出せます。
fun findUserOpt(id: Long): Option<User> = TODO()
fun getUser(id: Long): Either<UserError, User> = either {
findUserOpt(id)
.toEither { UserError.NotFound }
.bind()
}Optionのアンチパターン
Option が存在するからといって、どこでも使わないでください。Kotlin では、ほとんどのアプリケーションコードにおいて Option よりも String? のほうが明確です。関数型の演算子が本当に価値をもたらす場合に限って Option を使用してください。
確認問題
Arrow の Option で None.map { it.length } は何を返しますか?
復習:OptionとNullable
よくある質問
「OptionとNullable:それぞれを使う場面」レッスンは無料ですか?
はい。「OptionとNullable:それぞれを使う場面」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Kotlin Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Kotlin Academyコースには全4レッスンが含まれています。
「OptionとNullable:それぞれを使う場面」で何を学びますか?
ArrowのOption型とKotlinのnullable型を比較し、適切な方を選択します。 ブラウザで直接実行するハンズオンコードでKotlin Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Kotlin Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのKotlin Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「OptionとNullable:それぞれを使う場面」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このKotlin Academyレッスンでコードを書いて実行できますか?
はい。すべてのKotlin Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Either :例外を使わない型付きエラー処理
- Arrow Raise DSL:型付きエラーの合成
- OptionとNullable:それぞれを使う場面
- Arrowのコア型による関数型ドメインモデリング