是什么

是个class

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

目的

模式匹配时,有结果的时候进行一种处理,没结果的时候进行另一种处理.

用法

scala> val map=Map("key1"->"value1")
map: scala.collection.immutable.Map[String,String] = Map(key1 -> value1)scala> map.get("key1")
res18: Option[String] = Some(value1)scala> map.get("key2")
res19: Option[String] = Nonescala> res18.get
res20: String = value1scala> res19.get
java.util.NoSuchElementException: None.getat scala.None$.get(Option.scala:347)at scala.None$.get(Option.scala:345)... 32 elided

get返回的可能是Some类型,也可能是None类型.这俩其实都是Option类的子类

final case class Some[+A](x: A) extends Option[A] {def isEmpty = falsedef get = x
}case object None extends Option[Nothing] {def isEmpty = truedef get = throw new NoSuchElementException("None.get")
}

如果返回时Some类型的话,就可以用get进一步获取了.

还可以用于模式匹配,有结果的时候进行一种处理,没结果的时候进行另一种处理.

object Testoption {def main(args: Array[String]): Unit = {val map = Map("a" -> 1, "b" -> 2)val x: Unit = map.get("b") match {case Some(i) => println(i)case None => println(0)}}
}

Option其实也可以看做一种集合

Option其实也可以看做一种集合,不过集合里面只能有一个元素
然后,Option类也是可以用map这些算子的

object Test2 extends App {private val s: Option[Int] = updateFunc(Seq(1, 2, 3), Option(1))println(s.getOrElse(0))//7private val maybeTuple: Option[(Int, Int)] = s.map((_, 1))println(maybeTuple)//Some((7,1))def updateFunc(seq:Seq[Int],option: Option[Int]): Option[Int] ={println(s"option: $option + seq: ${seq.mkString(",")}")Option(seq.sum + option.getOrElse(0))}
}

option甚至可以转为List

 println(Option(1).toList)//List(1)

option是some类型的爸爸,如下两种写法都没错

object Test2 extends App {private val someTuple: Option[(Int, Int)] = Some(1, 2)println(someTuple)//Some((1,2))
}
object Test2 extends App {private val someTuple: Some[(Int, Int)] = Some(1, 2)println(someTuple)//Some((1,2))
}

Option类型的模式匹配

//对Option类型进行模式匹配取值
object Test extends App {val p1 = Person("liming", 23)val x = Option[Person](p1)x match {case Some(x)=>println(x.name)case None=>}
}case class Person(name: String, age: Int) {}

运行结果

liming

再比如,
Option类型用于模式匹配时,可以针对有值和没有值采取不同的操作! 具体就是如果匹配到有值,就是Some,执行Some后面的操作,否则执行None后面的操作.

//对Option类型进行模式匹配取值
object Test extends App {val p1 = Person("liming", 23)val p2=Person("dufu",18)val map=Map("libai"->p1,"difu"->p2)val x = map.get("test")x match {case Some(x)=>println(x.name)case None=>println("nothing")}
}case class Person(name: String, age: Int) {}

运行结果

nothing

当然,也可以不用模式匹配,但是取不到值得时候会报错,所以用模式匹配的时候,程序比较稳健

object Test extends App {val p1 = Person("liming", 23)val p2=Person("dufu",18)val map=Map("liming"->p1,"difu"->p2)val x = map("liming").nameprintln(x)//limingprivate val maybePerson: Option[Person] = map.get("liming")println(maybePerson.get.name)//limingprivate val maybePerson1: Option[Person] = map.get("none")//会报错//in thread "main" java.util.NoSuchElementException: None.getprintln(maybePerson1.get.name)
}case class Person(name: String, age: Int) {}

总结

  • option你可以看做是一个只有一个元素的集合
  • 在scala中尽量不用用null
  • option类解析的时候可以用模式匹配,程序比较稳健

scala Option类入门解析相关推荐

  1. Scala学习之Option类

    今天特意学习一下Option类型 一般来说,对于每种语言都会有一个关键字来表示一个对象引用的"无".比如在Java中使用的是null. 在Scala中是融合了函数式编程的风格,当预 ...

  2. Scala语法从入门到高级运用

    目录 1.scala语言特点 2.函数式编程 3.scala的安装 4.scala语言的简介 5.scala编程语言的规范 6.scala的类型体系(重点!) 7.变量的用法: 8.数值类型 9.类型 ...

  3. scala练习100道解析

    1.[primary]关于和Scala进行交互的基本方式REPL说法错误的是? C A.R 读取(read) B.E 求值(evaluate) C.P 解析(Parse) D.L 循环(Loop) R ...

  4. java实现linkstring,【JAVA SE基础篇】32.String类入门

    [JAVA SE基础篇]32.String类入门 1.字符串 1.String类又称作不可变字符序列 2.String位于java.lang包中,java程序默认导入java.lang包下所有的类 3 ...

  5. Scala和Scalatra入门–第一部分

    在本系列教程中,我们将更深入地研究scalatra. Scalatra是基于轻量级Scala的微型Web框架,可用于创建高性能网站和API. 在第一个教程中,我们将开始安装scalatra,并将测试项 ...

  6. Scala 自身类型(self-type) 解析

    Scala 自身类型(self-type) 解析 self 可以当做是this的别名,我们看下面的代码: object SelfCase {self =>val num = 5def main( ...

  7. Scala的类和对象

    Scala的类和对象 概念 定义类 基本语法 案例实操 属性 基本语法 案例实操 创建对象 基本语法 案例实操 概念 类:可以看成一个模板 对象:表示具体的事物 定义类 基本语法 [修饰符] clas ...

  8. 【scala】类的定义和单例对象

    一.类的定义 Scala类的定义跟JAVA中类的定义基本是一样的. 示例 class ChecksumAccumulator{var sum = 0;//Scala默认关键字为publicprivat ...

  9. Scala学习之路 (六)Scala的类、对象、继承、特质

    一.类 1.类的定义 scala语言中没有static成员存在,但是scala允许以某种方式去使用static成员 这个就是伴生机制,所谓伴生,就是在语言层面上,把static成员和非static成员 ...

最新文章

  1. java list 移除_java 中List删除实例详解
  2. 自定义水晶报表的显示
  3. CentOS7.1 KVM虚拟化之经常使用管理虚拟机命令(3)
  4. PC-用Windows XP自带的组策略加固操作系统
  5. CentOS安装docker图解(下载、卸载、安装、启动、检测、设置开机自启动)
  6. vmware不能resume问题,Collect Support Data,vmware.log
  7. easyui datagrid reload后自动全选解决
  8. [poj3252]Round Numbers_数位dp
  9. 计算机毕业设计springboot家政管理系统
  10. Matlab语言(一)
  11. OpenProj打开不了或者提示”Failed to load Java VM Library”的错误的解决方案
  12. php swfobject,swfobject参数详细介绍
  13. U盘文件夹被病毒隐藏了
  14. origin2019插入图片_OriginPro2019免费版
  15. 这五款小众软件你肯定不知道
  16. 外星人入侵游戏(Python3)
  17. centos7 修改时间、时区问题
  18. 江苏联亚国际展览中心跨境展批发产品B2B门户线上展会平台matchup expo SEO工作日志
  19. 2012年CSDN高校俱乐部秋季巡讲结案报告
  20. web字体库加载优化_优化Web字体以提高性能:最新技术

热门文章

  1. cli php 增强包_Linux 上安装 PHP 扩展
  2. 云丁智能锁使用说明书_出门不再带钥匙 云丁D2F智能指纹锁新体验
  3. linux安装telnet客户端_Redis 6.0 的客户端缓存是怎么肥事?一文带你了解!
  4. 21朵水仙花算法java_水仙花数算法 - hi_jyf - OSCHINA - 中文开源技术交流社区
  5. php判断是字符串类型,php使用strpos判断字符串中数字类型子字符串出错的解决方法 原创...
  6. ggplot2 多个柱状图比较_15. 再论ggplot2作图的图形元素组成
  7. 为什么爬虫都用python_python为什么叫网络爬虫
  8. Connected to the target VM, address: '127.0.0.1:60885', transport: 'socket'
  9. R的数据可视化,各种图表,常用统计量计算
  10. java treeset排序_java TreeSet的排序之自然排序