Scala-options
Scala-オプション
Scala Option [T]は、指定されたタイプのゼロまたは1つの要素のコンテナです。 Option [T]は、欠損値を表す Some [T] または None オブジェクトのいずれかです。 たとえば、ScalaのMapのgetメソッドは、特定のキーに対応する値が見つかった場合はSome(value)を生成し、特定のキーがマップで定義されていない場合は None を生成します。
オプションタイプはScalaプログラムで頻繁に使用され、これをJavaで利用可能な値がないことを示す null 値と比較できます。 たとえば、java.util.HashMapのgetメソッドは、HashMapに格納されている値を返します。値が見つからなかった場合はnullを返します。
主キーに基づいてデータベースからレコードを取得するメソッドがあるとします。
def findPerson(key: Int): Option[Person]
このメソッドは、レコードが見つかった場合はSome [Person]を返し、レコードが見つからない場合はNoneを返します。 次のプログラムに従ってください。
例
object Demo {
def main(args: Array[String]) {
val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
println("capitals.get( \"France\" ) : " + capitals.get( "France" ))
println("capitals.get( \"India\" ) : " + capitals.get( "India" ))
}
}
上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
capitals.get( "France" ) : Some(Paris)
capitals.get( "India" ) : None
オプションの値を分解する最も一般的な方法は、パターンマッチを使用することです。 たとえば、次のプログラムを試してください。
例
object Demo {
def main(args: Array[String]) {
val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
println("show(capitals.get( \"Japan\")) : " + show(capitals.get( "Japan")) )
println("show(capitals.get( \"India\")) : " + show(capitals.get( "India")) )
}
def show(x: Option[String]) = x match {
case Some(s) => s
case None => "?"
}
}
上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
show(capitals.get( "Japan")) : Tokyo
show(capitals.get( "India")) : ?
getOrElse()メソッドの使用
以下は、値が存在しない場合にgetOrElse()メソッドを使用して値またはデフォルトにアクセスする方法を示すサンプルプログラムです。
例
object Demo {
def main(args: Array[String]) {
val a:Option[Int] = Some(5)
val b:Option[Int] = None
println("a.getOrElse(0): " + a.getOrElse(0) )
println("b.getOrElse(10): " + b.getOrElse(10) )
}
}
上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
a.getOrElse(0): 5
b.getOrElse(10): 10
isEmpty()メソッドの使用
以下は、オプションがNoneかどうかをチェックするためにisEmpty()メソッドを使用する方法を示すサンプルプログラムです。
例
object Demo {
def main(args: Array[String]) {
val a:Option[Int] = Some(5)
val b:Option[Int] = None
println("a.isEmpty: " + a.isEmpty )
println("b.isEmpty: " + b.isEmpty )
}
}
上記のプログラムを Demo.scala に保存します。 このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
例
a.isEmpty: false
b.isEmpty: true
Scalaオプションメソッド
以下は、オプションで遊んでいる間に使用できる重要な方法です。 利用可能なメソッドの完全なリストについては、Scalaの公式ドキュメントを確認してください。
Sr.No | Methods with Description |
---|---|
1 |
def get: A オプションの値を返します。 |
2 |
def isEmpty: Boolean オプションがNoneの場合はtrue、それ以外の場合はfalseを返します。 |
3 |
def productArity: Int この商品のサイズ。 製品A(x_1、…、x_k)の場合、kを返します |
4 |
def productElement(n: Int): Any この製品のn番目の要素、0ベース。 つまり、製品A(x_1、…、x_k)の場合、0 <n <kであるx_(n + 1)を返します。 |
5 |
def exists(p: (A) ⇒ Boolean): Boolean このオプションが空でなく、述部pがこのオプションの値に適用されるとtrueを返す場合、trueを返します。 そうでなければ、falseを返します。 |
6 |
def filter(p: (A) ⇒ Boolean): Option[A] このオプションが空ではなく、このオプションの値に述語pを適用するとtrueを返します。 それ以外の場合は、なしを返します。 |
7 |
def filterNot(p: (A) ⇒ Boolean): Option[A] 空でない場合にこのオプションを返し、このオプションの値に述語pを適用するとfalseを返します。 それ以外の場合は、なしを返します。 |
8 |
def flatMap[B](f: (A) ⇒ Option[B]): Option[B] このオプションが空でない場合、このオプションの値にfを適用した結果を返します。 このオプションが空の場合、Noneを返します。 |
9 |
def foreach[U](f: (A) ⇒ U): Unit 空でない場合、オプションの値に指定されたプロシージャfを適用します。 そうでなければ、何もしません。 |
10 |
def getOrElse[B >: A](default: ⇒ B): B オプションが空でない場合はオプションの値を返し、そうでない場合はデフォルトの評価結果を返します。 |
11 |
def isDefined: Boolean オプションがSomeのインスタンスである場合はtrue、そうでない場合はfalseを返します。 |
12 |
def iterator: Iterator[A] 空でない場合はOptionの値を返すシングルトンイテレータを返し、オプションが空の場合は空のイテレータを返します。 |
13 |
def map[B](f: (A) ⇒ B): Option[B] このオプションが空でない場合、このオプションの値にfを適用した結果を含むSomeを返します。 それ以外の場合はNoneを返します。 |
14 |
def orElse[B >: A](alternative: ⇒ Option[B]): Option[B] このオプションが空でない場合はこのオプションを返し、そうでない場合は代替を評価した結果を返します。 |
15 |
def orNull 空でない場合はオプションの値を返し、空の場合はnullを返します。 |