• 【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

    在这里插入图片描述

    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

    参考链接:https://blog.csdn.net/weixin_44441131?spm=1000.2115.3001.5343

  • 相关阅读:
    【JavaEE初阶】前端篇:HTML(下篇)
    面试必备 css面试必考点
    多目标应用:基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度(MATLAB代码)
    Python —— Reference | hou
    【源码系列#04】Vue3侦听器原理(Watch)
    STM32 寄存器配置笔记——USART配置 打印
    有未经处理的异常: 0xC00000FD: Stack overflow 问题解决
    [附源码]Python计算机毕业设计Django抗疫医疗用品销售平台
    阿里云ACP云计算健康检查
    TCP全方面了解与学习
  • 原文地址:https://blog.csdn.net/weixin_44441131/article/details/126062130