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

  • 相关阅读:
    笔记本电脑没有麦克风,声音无法找到输入设备
    SpringBoot入门教程:浅聊POJO简单对象(VO、DTO、Entity)
    Java HashCode哈希值的基础概述
    浙江2022农民丰收节 国稻种芯:主场东阳活动农民群众联欢
    windows、Mac、IntelliJ IDEA常见的配置和使用技巧
    ArcGIS学习(十四)OD分析
    混合编程之多线程
    十六、模型构建器(ModelBuilder)快速提取城市建成区——理论介绍
    java计算机毕业设计ssm+vue网络考试信息网站
    MySQL表级锁、行级锁与多粒度锁(意向锁)
  • 原文地址:https://blog.csdn.net/weixin_44441131/article/details/126062130