Young's blog Young's blog
首页
Spring
  • 前端文章1

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Young

首页
Spring
  • 前端文章1

    • JavaScript
  • 学习笔记

    • 《JavaScript教程》
    • 《JavaScript高级程序设计》
    • 《ES6 教程》
    • 《Vue》
    • 《React》
    • 《TypeScript 从零实现 axios》
    • 《Git》
    • TypeScript
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Hadoop

  • kafka

  • Flume

  • hive

  • scala

    • Scala 入 门
    • scala 函数式编程
    • scala 面向对象
    • scala 集合
    • scala 第 8 章 模式匹配
    • scala 第 9 章 异 常
    • 进阶

      • scala Option类型详解
        • 1. Option,Some,None
          • 4.1 默认值 getOrElse
          • 4.2 模式匹配
          • 4.3 作为集合的 Option
          • 4.4 for 语句
      • scala 下划线用法总结
      • scala eq,equals,==,===
    • scala 第 11 章 泛 型
    • scala 第 12 章 总结
  • spark

  • 大数据
  • scala
  • 进阶
andanyang
2023-11-03
目录

scala Option类型详解

# scala Option 类型详解

Scala 中提供 null 值,但尽量避免使用,除非要与 Java 交互。(在 Java 里,null 是一个关键字,不是一个对象,所以对它调用任何方法都是非法的,这与函数式编程的 scala 不符合)。Scala 试图通过摆脱 null 来解决这个问题,并提供自己的类型用来表示一个值是可选的(有值或无值), 这就是 Option[A] 特质。

# 1. Option,Some,None

Option[A] 是一个类型为 A 的可选值的容器: 如果值存在, Option[A] 就是一个 Some[A] ,如果不存在, Option[A] 就是对象 None。Some 与 None 是 Option 的两个子类!

# 2. 使用场景

scala 鼓励你在变量和函数返回值可能不会引用任何值的时候使用 Option 类型。例如集合 Map 的 get 方法:

val map = Map("Japan"->"Tokyo", "China"->"Beijing")
println(map.get("China"))
println(map.get("France"))
println(map.get("Japan"))
1
2
3
4

在 模式匹配 中也可以使用 Option 类型

val nameMaybe:Option[String] = Some("tom")
nameMaybe match {
  case Some(_) => println("yes")
  case None => println("No name")
}
1
2
3
4
5

# 3. 创建 Option

通常,你可以直接实例化some样例类来创建一个Option。

val greeting:Option[String]Some("Hello world")
1

或者,在知道值缺失的情况下,直接使用None对象:

val greeting:Option[String]None
1

然而,在实际工作中,你不可避免的要去操作一些Java库,或者是其他将nu11作为缺失值的JVM语言的代码。为此,Option 伴生对象提供了一个工厂方法,可以根据给定的参数创建相应的Option:

val absentGreeting:Option[String]Option(null)//absentGreeting will be None
val presentGreeting:Option[String]Option("Hello!")//presentGreeting will be Some("Hello!")
1
2

# 4. 使用 Option

case class User(
    id: Int,
    firstName: String,
    lastName: String,
    age: Int,
    gender: Option[String]
  )

  object UserRepository {
    private val users = Map(1 -> User(1, "John", "Doe", 32, Some("male")),
                            2 -> User(2, "Johanna", "Doe", 30, None))
    def findById(id: Int): Option[User] = users.get(id)
    def findAll = users.values
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 4.1 默认值 getOrElse

很多时候,在值不存在时,需要进行回退,或者提供一个默认值。 Scala 为 Option 提供了 getOrElse 方法,以应对这种情况

val user = User(2, "Johanna", "Doe", 30, None)
println("Gender: " + user.gender.getOrElse("not specified")) // will print "not specified"
1
2

# 4.2 模式匹配

val user = User(2, "Johanna", "Doe", 30, None)
  user.gender match {
    case Some(gender) => println("Gender: " + gender)
    case None => println("Gender: not specified")
  }
1
2
3
4
5

# 4.3 作为集合的 Option

Option 是类型 A 的容器,更确切地说,你可以把它看作是某种集合, 这个特殊的集合要么只包含一个元素,要么就什么元素都没有。虽然在类型层次上, Option 并不是 Scala 的集合类型, 但,凡是你觉得 Scala 集合好用的方法, Option 也有, 你甚至可以将其转换成一个集合,比如说 List 。

# 4.4 for 语句

现在,你已经知道 Option 可以被当作集合来看待,并且有 map 、 flatMap 、 filter 这样的方法。 可能你也在想 Option 是否能够用在 for 语句中,答案是肯定的。 而且,用 for 语句来处理 Option 是可读性最好的方式,尤其是当你有多个 map 、flatMap 、filter 调用的时候。

for {
  a <- Set(1)
  b <- Option(41)
} yield (a + b)
// : Set[Int] = Set(42)
1
2
3
4
5
编辑 (opens new window)
上次更新: 2024/04/19, 08:52:45
scala 第 9 章 异 常
scala 下划线用法总结

← scala 第 9 章 异 常 scala 下划线用法总结→

最近更新
01
idea 热部署插件 JRebel 安装及破解,不生效问题解决
04-10
02
spark中代码的执行位置(Driver or Executer)
12-12
03
大数据技术之 SparkStreaming
12-12
更多文章>
Theme by Vdoing | Copyright © 2019-2024 Young | MIT License
浙ICP备20002744号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式