文章目录

  • Option和Some
  • Option和None
  • Option和模式匹配

在java 8中,为了避免NullPointerException,引入了Option,在Scala中也有同样的用法。他们就是Option, Some 和None.

其中Option是一个抽象类。

sealed abstract class Option[+A] extends Product with Serializable

我们看下Some和None的定义:

final case class Some[+A](@deprecatedName('x, "2.12.0") value: A) extends Option[A] {def isEmpty = falsedef get = value@deprecated("Use .value instead.", "2.12.0") def x: A = value
}/** This case object represents non-existent values.**  @author  Martin Odersky*  @since   1.0*/
@SerialVersionUID(5066590221178148012L) // value computed by serialver for 2.11.2, annotation added in 2.11.4
case object None extends Option[Nothing] {def isEmpty = truedef get = throw new NoSuchElementException("None.get")
}

可以看到Some是一个继承了Option的case class。 而None是一个继承了Option[Nothing]的case object。

我们看下在程序中该怎么使用他们。

Option和Some

  println("Step 1: How to use Option and Some - a basic example")val glazedDonutTaste: Option[String] = Some("Very Tasty")println(s"Glazed Donut taste = ${glazedDonutTaste.get}")

上面的例子中,我们定义了一个类型为String的Option,然后用Some给它赋了一个值。接下来我们调用Option的get方法来获取这个String值。

下面是运行的结果:


Step 1: How to use Option and Some - a basic example
Glazed Donut taste = Very Tasty

这里直接调用get会有问题,就是get出来的结果也可能是空的,这样就不能避免NullPointerException的问题。

Option和None

下面我们看下None的用法:

println("\nStep 2: How to use Option and None - a basic example")
val glazedDonutName: Option[String] = None
println(s"Glazed Donut name = ${glazedDonutName.getOrElse("Glazed Donut")}")

上面我们定义了一个Option,并给给他赋值None。在获取值的时候,我们没有调用get方法,相反我们使用的是getOrElse,如果值为空,则给他一个默认值。 下面是输出结果:

Step 2: How to use Option and None - a basic example
Glazed Donut name = Glazed Donut

注意, None没有get方法, 如果你像第一个例子一样调用的话,会报错:java.util.NoSuchElementException: None.get。

Option和模式匹配

上面的例子中我们使用了getOrElse来获取值,还有一种方法叫做模式匹配:


println("\nStep 3: How to use Pattern Matching with Option")
glazedDonutName match {case Some(name) => println(s"Received donut name = $name")case None       => println(s"No donut name was found!")

这样我们不管Option里面到底有没有值,都可以完成匹配。下面是输出的结果。

Step 3: How to use Pattern Matching with Option
No donut name was found!

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

更多教程请参考 flydean的博客

Scala教程之:Option-Some-None相关推荐

  1. Scala教程之:Either

    在之前的文章中我们提到了Option,scala中Option表示存在0或者1个元素,如果在处理异常的时候Option就会有很大的限制,因为Option如果返回None,那么我并不知道具体的异常到底是 ...

  2. Scala教程之:Future和Promise

    文章目录 定义返回Future的方法 阻塞方式获取Future的值 非阻塞方式获取Future的值 Future链 flatmap VS map Future.sequence() VS Future ...

  3. scala教程之:可见性规则

    文章目录 public Protected private scoped private 和 scoped protected 和java很类似,scala也有自己的可见性规则,不同的是scala只有 ...

  4. Scala教程之:深入理解协变和逆变

    文章目录 函数的参数和返回值 可变类型的变异 在之前的文章中我们简单的介绍过scala中的协变和逆变,我们使用+ 来表示协变类型:使用-表示逆变类型:非转化类型不需要添加标记. 假如我们定义一个cla ...

  5. Scala教程之:可变和不变集合

    文章目录 mutable HashMap immutable HashMap 集合在程序中是非常有用的,只有用好集合才能真正感受到该语言的魅力.在scala中集合主要在三个包里面:scala.coll ...

  6. Scala教程之:PartialFunction

    Scala中有一个很有用的traits叫PartialFunction,我看了下别人的翻译叫做偏函数,但是我觉得部分函数更加确切. 那么PartialFunction是做什么用的呢?简单点说Parti ...

  7. Scala教程之:Enumeration

    Enumeration应该算是程序语言里面比较通用的一个类型,在scala中也存在这样的类型, 我们看下Enumeration的定义: abstract class Enumeration (init ...

  8. Scala教程之:scala的参数

    文章目录 默认参数值 命名参数 scala的参数有两大特点: 默认参数值 命名参数 默认参数值 在Scala中,可以给参数提供默认值,这样在调用的时候可以忽略这些具有默认值的参数. def log(m ...

  9. Scala教程之:可扩展的scala

    文章目录 隐式类 限制条件 字符串插值 s 字符串插值器 f 插值器 raw 插值器 自定义插值器 Scala是扩展的,Scala提供了一种独特的语言机制来实现这种功能: 隐式类: 允许给已有的类型添 ...

最新文章

  1. GuozhongCrawler系列教程 (4) StartContext具体解释
  2. bzoj1874: [BeiJing2009 WinterCamp]取石子游戏
  3. 网站产品设计应避免的7个误区
  4. qt中如何模拟按钮点击_qt – 在Windows中模拟鼠标按钮单击
  5. html5布局总结,HTML5网页布局的总结
  6. idea,eclipse创建多模块项目
  7. 提权命令_利用Linux文本操作命令ed进行提权
  8. caany边缘检测matlab,自适应canny算法研究及其在图像边缘检测中的应用.pdf
  9. cmd设置mysql初始密码_windows下mysql初始密码设置
  10. 入职五年回顾(十五) 2013年10月
  11. 《深入理解OSGi:Equinox原理、应用与最佳实践》一3.2 Bundle状态及转换
  12. Java 编码规范10(单元测试)
  13. MATLAB 如何将视频和音频写入同一个文件?以视频上下颠倒为例,附带详细注释
  14. html语言中标记h1代表什么意思,html中h1是什么意思
  15. 论文笔记:You Only Look Once: Unified, Real-Time Object Detection(yolo v1)
  16. sql语句实现查询实例
  17. Elasticsearch快速初始化数据
  18. 金字塔图表 html,echarts 金字塔
  19. 伦敦网约车新规:须通过英语水平考试
  20. 京东监控下单助手代码编写

热门文章

  1. php 下载的压缩文件,php在线压缩打包rar并自动下载文件的例子
  2. java list接口方法_java List集合接口的坑
  3. linux 键盘 数值,键盘数值对照表
  4. WinDbg学习笔记(二)--字符串访问断点
  5. PHP、Node、Ruby和Python应用,漏洞修复
  6. 《深入理解Kafka:核心设计与实践原理》笔误及改进记录
  7. 一文简述FFmpeg
  8. LiveVideoStackCon深圳-嵌入式音频开发
  9. 杨攀:融云专注极致技术 不忘初心打造极简体验
  10. Hadoop之HDFS概述