【Scala】Scala ~ 基本編 / Option型 ~

■ はじめに

開発中だが、バグったので整理。

目次

【1】Option型
 1)Some
 2)None
【2】主なメソッド
 1)getOrElse
 2)isEmpty
 3)isDefined
 4)orNull
 5)orElse
【3】サンプル
 例1:主なメソッド
【4】NULLおよび混同しそうなキーワード
 1)null
 2)None
 3)Nothing
 4)Nil

【1】Option型

* 値があるかないかを表す型
* 2種類のサブクラスを持っている

1)Some

* 値があることを表す型

2)None

* 値がないことを表す型

例:コンパイルエラー

def getHello(isNone: Boolean = false): Option[String] = {
  // Option[String]で指定した場合、Some()で返さないとコンパイルエラー
  // つまり、「if isNone None else "Hello"」はできない
  if isNone None else Some("Hello")
}

【2】主なメソッド

1)getOrElse

* value.getOrElse("【デフォルト値】") の場合
  value に値がなければ、引数の【デフォルト値】を返す

2)isEmpty

* 値があるかどうかを Boolean 型で返す (true: 値なし、false: 値あり)

3)isDefined

* 定義されているかを Boolean 型で返す (true: 定義あり、false: 定義なし)

4)orNull

* Noneだったら、nullを返す
* Someだったら、その中身を返す

object Hello {
  def main(args: Array[String]): Unit = {
    println(Option("Mike").orNull) // Mike
    println(None.orNull) // null
  }
}

5)orElse

* Noneだったら、指定したデフォルトのOption型を返す
* Someだったら、そのままそのSomeを返す

object Hello {
  def main(args: Array[String]): Unit = {
    println(Option("Mike").orElse(Option("Tom"))) // Some(Mike)
    println(None.orElse(Option("Tom"))) // Some(Tom)
  }
}

【3】サンプル

例1:主なメソッド

object  Hello {
  def main(args: Array[String]): Unit = {
    val value: Option[String] = None
    // Default
    println(value.getOrElse("Default"))
    // true
    println(value.isEmpty)
    // false
    println(value.isDefined)
    // null
    println(value.orNull)
  }
}

【4】NULLおよび混同しそうなキーワード

1)null

* Java の nullと同じ

2)None

* 上述の通り「値がないことを表す型」
* null とは、別物

例:開発中にバグを出したコード

val value: Option[String] = None
val result = if (value != null) value.get else "NG" // ここで「java.util.NoSuchElementException: None.get」
println(result)

3)Nothing

* クラス階層における、「一番下」に位置するクラスで全ての型のサブタイプ

4)Nil

* 「空のリスト」を表すオブジェクト
 => 名前が悪くない、、、empty でよかったのでは??

参考文献

https://qiita.com/f81@github/items/7bca48469d9aea65780d
http://www.mwsoft.jp/programming/scala/scala_option.html

関連記事

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / ジェネリック
https://dk521123.hatenablog.com/entry/2023/03/21/003817
Scala ~ 基本編 / Either型 ~
https://dk521123.hatenablog.com/entry/2023/08/02/132315
Scala ~ 基本編 / 例外処理 ~
https://dk521123.hatenablog.com/entry/2023/10/05/000135