2007-07-30
scala学习笔记(2) -- Option Class
关键字: scala functional java
Scala的Option class借鉴了sml里的option type。在sml里定义如下
Standard ML 代码
- datatype 'a option = NONE | SOME of 'a;
相对应的,scala里是这么定义的
scala 代码
- sealed abstract class Option[+A] extends Product {
- def isEmpty: Boolean
- def isDefined: Boolean = !isEmpty
- def get: A
- def getOrElse[B >: A](default: => B): B =
- if (isEmpty) default else this.get
- def map[B](f: A => B): Option[B] =
- if (isEmpty) None else Some(f(this.get))
- def flatMap[B](f: A => Option[B]): Option[B] =
- if (isEmpty) None else f(this.get)
- def filter(p: A => Boolean): Option[A] =
- if (isEmpty || p(this.get)) this else None
- def foreach(f: A => Unit) {
- if (!isEmpty) f(this.get)
- }
- def orElse[B >: A](alternative: => Option[B]): Option[B] =
- def elements: Iterator[A] =
- if (isEmpty) Iterator.empty else Iterator.fromValues(this.get)
- def toList: List[A] =
- if (isEmpty) List() else List(this.get)
- }
- final case class Some[+A](x: A) extends Option[A] {
- def isEmpty = false
- def get = x
- }
- case object None extends Option[Nothing] {
- def isEmpty = true
- def get = throw new NoSuchElementException("None.get")
- }
比较重要的是Option里的函数,可以看到通过Option类型,有机地把“正常的”值和None结合了起来,由于Some(T)和None都是从 Option派生的,自然就支持了象map/filtering之类的函数式风格。更重要的一点,Some和None都是case class,从而可以将任何对象用在pattern matching里。如果再看一下scala的源代码中,在collection的实现中大量用到的就是Option对象,至于通过impllicit def在普通的对象和Option对象中转换的方法,以后会继续详细解释。
示例
scala 代码
- def getUser(user: User, isTrue: Boolean): Option[User] = {
- if (isTrue) Some(user)
- else None
- }
- // pattern matching
- getUser("chris") match {
- case Some(user) => user.modify()
- case None => error("not found")
- }
- // default value
- getUser("chris") getOrElse defaultUser
- // 通过Option和impllicit def定义复杂的操作
- for( val x <- Some(3); val y <- Some(4) ) yield x * y // get Some(12)
- for( val x:int <- Some(3); val y:int <- None ) yield x * y // get None
- (for( val x:int <- Some(3); val y:int <- None ) yield x * y) getOrElse 9 // get 9
发表评论
- 浏览: 10117 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
在scala里调用Hibernate ...
是在JVM上的一种函数式语言,和java可以互相调用,http://www.sc ...
-- by fakechris -
scala学习笔记(1)
用了 Java 的实现描述语法我知道;不过利用了虚类,确实有点新意啊。
-- by Lich_Ray -
scala学习笔记(1)
实际上String=>Unit 是一个scala的trait,相当于java的接 ...
-- by fakechris -
scala学习笔记(1)
var fn = new ( String=>Unit ) { def ap ...
-- by Lich_Ray -
python的小工具,把hibern ...
嗯,输入太工整了正则表达式也就能处理这么工整的代码了,格式比较乱的还是要上ast ...
-- by fakechris






评论排行榜