68.scala编程思想笔记——使用Option

109 阅读1分钟

68.scala编程思想笔记——使用Option

欢迎转载,转载请标明出处:blog.csdn.net/notbaron/ar…
源码下载连接请见第一篇笔记。\

有时候方法会产生没有任何意义的结果。这种情况发生时候,方法没有产生错误,也没有任何地方有问题,只是没有答案而已。

         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并不是有什么选择,实际上没有任何选择,它们要么是某种事物,要么什么都不是。