Option

package option

sealed trait Option[+A] {

  def map[B](f: A => B): Option[B] = this match {
    case None    => None
    case Some(a) => Some(f(a))
  }

  def flatMap[B](f: A => Option[B]): Option[B] = this match {
    case None    => None
    case Some(a) => f(a)
  }

  def getOrElse[B >: A](default: => B): B = this match {
    case None    => default
    case Some(a) => a
  }

  def orElse[B >: A](ob: => Option[B]): Option[B] = this match {
    case None => ob
    case _    => this
  }

  def filter(f: A => Boolean): Option[A] = this match {
    case Some(a) if (f(a)) => this
    case _                 => None
  }
}

case class Some[+A](get: A) extends Option[A]

case object None extends Option[Nothing]

object Run {

  def main(args: Array[String]): Unit = {
    val some = Some(1.01000)
    val none = None: Option[Double]

    println(some.map(_ + 1))
    println(none.map(_ + 1))

    println(some.flatMap(x => Some(x + 1)))
    println(none.flatMap(x => Some(x + 1)))

    println(some.getOrElse("3.14"))
    println(none.getOrElse("3.14"))

    println(some.orElse(Some(1.414)))
    println(none.orElse(Some(1.414)))

    println(some.filter(x => x == 1.01))
    println(none.filter(x => x == 1.01))

  }

}
Some(2.01)
None
Some(2.01)
None
1.01
3.14
Some(1.01)
Some(1.414)
Some(1.01)
None
原文地址:https://www.cnblogs.com/JonkeyGuan/p/5426404.html