Scala教程之:Option-Some-None
文章目录
- 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相关推荐
- Scala教程之:Either
在之前的文章中我们提到了Option,scala中Option表示存在0或者1个元素,如果在处理异常的时候Option就会有很大的限制,因为Option如果返回None,那么我并不知道具体的异常到底是 ...
- Scala教程之:Future和Promise
文章目录 定义返回Future的方法 阻塞方式获取Future的值 非阻塞方式获取Future的值 Future链 flatmap VS map Future.sequence() VS Future ...
- scala教程之:可见性规则
文章目录 public Protected private scoped private 和 scoped protected 和java很类似,scala也有自己的可见性规则,不同的是scala只有 ...
- Scala教程之:深入理解协变和逆变
文章目录 函数的参数和返回值 可变类型的变异 在之前的文章中我们简单的介绍过scala中的协变和逆变,我们使用+ 来表示协变类型:使用-表示逆变类型:非转化类型不需要添加标记. 假如我们定义一个cla ...
- Scala教程之:可变和不变集合
文章目录 mutable HashMap immutable HashMap 集合在程序中是非常有用的,只有用好集合才能真正感受到该语言的魅力.在scala中集合主要在三个包里面:scala.coll ...
- Scala教程之:PartialFunction
Scala中有一个很有用的traits叫PartialFunction,我看了下别人的翻译叫做偏函数,但是我觉得部分函数更加确切. 那么PartialFunction是做什么用的呢?简单点说Parti ...
- Scala教程之:Enumeration
Enumeration应该算是程序语言里面比较通用的一个类型,在scala中也存在这样的类型, 我们看下Enumeration的定义: abstract class Enumeration (init ...
- Scala教程之:scala的参数
文章目录 默认参数值 命名参数 scala的参数有两大特点: 默认参数值 命名参数 默认参数值 在Scala中,可以给参数提供默认值,这样在调用的时候可以忽略这些具有默认值的参数. def log(m ...
- Scala教程之:可扩展的scala
文章目录 隐式类 限制条件 字符串插值 s 字符串插值器 f 插值器 raw 插值器 自定义插值器 Scala是扩展的,Scala提供了一种独特的语言机制来实现这种功能: 隐式类: 允许给已有的类型添 ...
最新文章
- GuozhongCrawler系列教程 (4) StartContext具体解释
- bzoj1874: [BeiJing2009 WinterCamp]取石子游戏
- 网站产品设计应避免的7个误区
- qt中如何模拟按钮点击_qt – 在Windows中模拟鼠标按钮单击
- html5布局总结,HTML5网页布局的总结
- idea,eclipse创建多模块项目
- 提权命令_利用Linux文本操作命令ed进行提权
- caany边缘检测matlab,自适应canny算法研究及其在图像边缘检测中的应用.pdf
- cmd设置mysql初始密码_windows下mysql初始密码设置
- 入职五年回顾(十五) 2013年10月
- 《深入理解OSGi:Equinox原理、应用与最佳实践》一3.2 Bundle状态及转换
- Java 编码规范10(单元测试)
- MATLAB 如何将视频和音频写入同一个文件?以视频上下颠倒为例,附带详细注释
- html语言中标记h1代表什么意思,html中h1是什么意思
- 论文笔记:You Only Look Once: Unified, Real-Time Object Detection(yolo v1)
- sql语句实现查询实例
- Elasticsearch快速初始化数据
- 金字塔图表 html,echarts 金字塔
- 伦敦网约车新规:须通过英语水平考试
- 京东监控下单助手代码编写