0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. null を避ける
  2. Option の map と flatMap
  3. getOrElse と fold
  4. for 内の Option
← Scala for Backend Engineering & Functional Programmingに戻る