null を避ける
Option の基礎です。
「null を避ける」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
nullの問題
多くの言語では、値が存在しないことをnullで表します。しかし、チェックを忘れると、nullによって恐ろしいNullPointerExceptionが発生します。
Scalaには、より安全な代替手段としてOption型があります。
Optionとは
Option[A]は、値が存在する場合と存在しない場合を表します。ケースは正確に2つあります。
- 値が存在するときは
Some(value) - 値が存在しないときは
None
型そのものによって、値が存在しない可能性が示されます。
object Main {
def main(args: Array[String]): Unit = {
val present: Option[Int] = Some(42)
val absent: Option[Int] = None
println(present)
println(absent)
}
}Someを作成する
既存の値をSomeで包むと、その値が確実に存在することを表せます。
object Main {
def main(args: Array[String]): Unit = {
val name: Option[String] = Some("Ada")
println(name)
}
}Noneで不在を表す
Noneは、何も存在しない場合に使う唯一の値です。どのOption型にも利用できます。
object Main {
def lookup(found: Boolean): Option[Int] =
if (found) Some(100) else None
def main(args: Array[String]): Unit = {
println(lookup(true))
println(lookup(false))
}
}失敗する可能性のある関数
Optionを返すことで、結果が存在しない可能性を型シグネチャに明示できます。呼び出し側はその可能性を無視できません。
object Main {
def findUser(id: Int): Option[String] =
if (id == 1) Some("Grace") else None
def main(args: Array[String]): Unit = {
println(findUser(1))
println(findUser(2))
}
}isDefinedとisEmptyで確認する
isDefinedはOptionがSomeかどうかを示し、isEmptyはNoneかどうかを示します。
object Main {
def main(args: Array[String]): Unit = {
val a: Option[Int] = Some(5)
val b: Option[Int] = None
println(a.isDefined)
println(b.isEmpty)
}
}Optionをパターンマッチングする
Optionはsealed ADTなので、パターンマッチングを行えます。これにより、値の存在と不在の両方を明確に処理できます。
object Main {
def greet(name: Option[String]): String = name match {
case Some(n) => s"Hello, $n"
case None => "Hello, stranger"
}
def main(args: Array[String]): Unit = {
println(greet(Some("Bo")))
println(greet(None))
}
}Nullableな値からOptionを作る
nullを返すコードを扱う必要がある場合は、Option(...)で包みます。nullはNoneに、実際の値はSomeに変換されます。
object Main {
def main(args: Array[String]): Unit = {
val maybe = Option("data")
val nothing = Option(null)
println(maybe)
println(nothing)
}
}標準ライブラリがOptionを返す
多くの組み込みメソッドは、エラーのリスクを避けるため、すでにOptionを返します。たとえば、List.headOptionは空のリストを安全に処理します。
object Main {
def main(args: Array[String]): Unit = {
val xs = List(1, 2, 3)
val empty = List.empty[Int]
println(xs.headOption)
println(empty.headOption)
}
}nullではなくOptionを使う理由
Optionがnullより優れているのは、次の理由によります。
- 値の不在を型に明示できます
- 呼び出し側に不在のケースへの対応を求められます
- NullPointerExceptionをなくせます
- map、flatMap、for内包表記と組み合わせられます
すべてを組み合わせる
Optionを返す小さな検索処理を、パターンマッチングで安全に処理します。
object Main {
val prices = Map("apple" -> 3, "pear" -> 5)
def priceOf(item: String): Option[Int] = prices.get(item)
def main(args: Array[String]): Unit = {
priceOf("apple") match {
case Some(p) => println(s"costs $p")
case None => println("not for sale")
}
println(priceOf("banana"))
}
}クイックチェック
Optionについての理解度を確認しましょう。
まとめ
Optionを使ってnullを避ける方法を学びました。
Option[A]はSome(value)またはNoneです- 値が存在しない可能性を型に明示できます
isDefined/isEmptyまたはパターンマッチングで確認しますOption(x)を使ってNullableな値を包みますheadOptionやMap.getなどのライブラリメソッドはOptionを返します
よくある質問
「null を避ける」レッスンは無料ですか?
はい。「null を避ける」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「null を避ける」で何を学びますか?
Option の基礎です。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「null を避ける」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。