Scala 选项(Option)

  • 选项

    Scala Option [T]是给定类型的零个或一个元素的容器。Option [T]可以是Some [T]None对象,表示缺少值。例如,Scala Map的get方法如果找到了与给定键相对应的值,则生成Some(value);如果Map中未定义给定键,则生成None。选项类型在Scala程序中经常使用,您可以将其与Java中可用的空值(表示无值)进行比较。例如,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" ))
       }
    }
    
    尝试一下
    输出-
    
    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 => "?"
       }
    }
    
    尝试一下
    输出:
    
    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) )
       }
    }
    
    尝试一下
    输出:
    
    a.getOrElse(0): 5
    b.getOrElse(10): 10
    
  • 使用 isEmpty() 方法

    以下是示例程序,显示了如何使用 isEmpty() 方法检查选项是否为None。
    
    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 )
       }
    }
    
    尝试一下
    输出:
    
    a.isEmpty: false
    b.isEmpty: true
    
  • Scala 选项方法

    以下是在使用Option时可以使用的重要方法。有关可用方法的完整列表,请查看Scala的参考手册。
    方法 描述
    def get: A 返回选项的值。
    def isEmpty: Boolean 如果选项为None,返回true,否则返回false。
    def productArity: Int 这个产品的尺寸。对于产品a (x_1,…, xk),返回k
    def productElement(n: Int): Any 乘积的第n个元素,以0为基。换句话说,对于乘积a (x_1,…, x_k)返回x_(n+1),其中0 < n < k。
    def exists(p: (A) => Boolean): Boolean 如果该选项为非空,则返回true;如果谓词p应用于该选项的值,则返回true。否则,返回false。
    def filter(p: (A) => Boolean): Option[A] 如果非空,则返回该选项,并将谓词p应用于该选项的值将返回true。否则,返回None。
    def filterNot(p: (A) => Boolean): Option[A] 如果非空,则返回该选项,并将谓词p应用于该选项的值将返回false。否则,返回None。
    def flatMap[B](f: (A) => Option[B]): Option[B] 如果该选项非空,则返回对该选项的值应用f的结果。如果此选项为空,则返回None。
    def foreach[U](f: (A) => U): Unit 如果选项的值是非空的,则应用给定的过程f。否则,什么都不做。
    def getOrElse[B >: A](默认: => B): B 返回选择的值如果非空的选项,否则返回的结果评估默认
    def isDefined: Boolean 如果选项是某个实例,则返回true,否则返回false。
    def iterator: Iterator[A] 如果非空,返回一个单例迭代器,返回选项的值;如果选项为空,返回一个空迭代器。
    def map[B](f: (A) => B): Option[B] 如果该选项非空,则返回包含应用f到该选项值的结果的Some。否则返回None。
    def orElse[B >: A](alternative: => Option[B]): Option[B] 如果非空则返回此选项,否则返回alternative的计算结果。
    def orNull 如果非空,则返回选项的值;如果为空,则返回null。