68.scala编程思想笔记——使用Option
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50458757
源码下载连接请见第一篇笔记。
有时候方法会产生没有任何意义的结果。这种情况发生时候,方法没有产生错误,也没有任何地方有问题,只是没有答案而已。
Option的意图就是在此。
例如如下代码,只对0~1感兴趣,其他值的话不会返回任何信息。
import com.atomicscala.AtomicTest._
def banded(input:Double) =
if(input >1.0 || input < 0.0)
Left("Nothing")
else
Right(math.round(input * 100.0))
banded(0.555) is Right(56)
banded(-0.1) is Left("Nothing")
banded(1.1) is Left("Nothing")
修改如下:
import com.atomicscala.AtomicTest._
def banded2(input:Double) =
if(input >1.0 || input < 0.0)
None
else
Some(math.round(input* 100.0))
banded2(0.555) is Some(56)
banded2(-0.1) is None
banded2(1.1) is None
for(x <- banded2(0.1))
x is 10
val result = for {
d <-Vector(-0.1, 0.1, 0.3, 0.9, 1.2)
n <-banded2(d)
} yield n
result is Vector(10, 30, 90)
如果返回Some和None,那么Scala会推断出Option.
Option所具有的像容器一样的行为不仅限于推导,还提供了在大多数容器中都可以看到的基本操作集,包括foreach和map,在对None进行操作时它们都可以正确执行。因此,在Option上执行操作时不必检查是Some还是None,只需抽取其中的值。例如:
import com.atomicscala.AtomicTest._
def p(s:Option[String])= s.foreach(println)
p(Some("Hi")) // Prints "Hi"
p(Option("Hi")) // Prints "Hi"
p(None) // Doesn't do anything!
def f(s:Option[String]) = s.map(_ * 2)
f(Some("Hi")) is Some("HiHi")
f(None) is None
Option(null) is None
Option并不是有什么选择,实际上没有任何选择,它们要么是某种事物,要么什么都不是。