Scala学习笔记18: Either 类型

第十八章 Either 类型

Either 类型是Scala函数式编程中处理可能失败操作的重要工具 ;

它提供了一种类型安全、优雅的方式来表达成功和失败两张可能性, 使代码更易读、更易维护 .

1- Either 语义: 两种可能的容器

Either 字面意思是’两者之一’, 它表示一个值可能属于两种类型之一 ; Either 有两个子类型: LeftRight ;

  • Right 代表操作成功, 并包含成功的结果值 ; 通常, 我们会将 Right 视为默认的 ‘好’ 路径 ;
  • Left 代表操作失败, 并包含失败的原因; 这个原因可以是异常信息、错误码、或者任何能解释失败的信息 ;

Either 的强大之处在于它强制开发者在使用结果之前考虑两种可能性, 从而避免潜在的错误, 例如臭名昭著的 NullPointerException ;

2- 创建 Either 实例

创建 Either 实例非常简单, 可以使用 LeftRight 的构造方法:

    // 创建一个表示成功的 Either, 值为INT 类型
    val success: Either[String, Int] = Right(1)

    // 创建一个表示失败的 Either, 值为String 类型
    val failure: Either[String, Int] = Left("error!!!")

需要注意的是, LeftRight 的类型参数需要与 Either 的类型参数一致 .

3- Either 用法

3.1 模式匹配

可以使用模式匹配来处理 Either 的结果:

    // 创建一个表示成功的 Either, 值为INT 类型
    val success: Either[String, Int] = Right(10)

    // 创建一个表示失败的 Either, 值为String 类型
    val failure: Either[String, Int] = Left("error!!!")

    success match {
      case Right(value) => println(value)
      case Left(error) => println(error)
    }
    // Output: 10
3.2 fold 方法

Either 提供了一个 fold 方法, 可以更简洁地处理两种情况 :

    // 创建一个表示成功的 Either, 值为INT 类型
    val success: Either[String, Int] = Right(10)

    // 创建一个表示失败的 Either, 值为String 类型
    val failure: Either[String, Int] = Left("error!!!")

    val result = success.fold(
      error => s"操作失败: $error", // 处理 Left 的情况
      value => s"操作成功: $value"  // 处理 Right 的情况
    )

    println(result) // Output: 操作成功: 10
3.3 函数式操作

Scala 2.12 或更高版本 Either 支持 mapflatMapfilter 等高阶函数, 方便进行函数式操作:

    val maybeInt: Either[String, Int] = Right(6)

    // 使用 `map` 函数对 Right 中的值进行操作
    val maybeDouble: Either[String, Double] = maybeInt.map(_ * 2.5)

    // 使用 `flatMap` 函数进行链式操作
    val result: Either[String, Int] = for {
      i <- maybeInt.right // 注意这里使用 Right 投影
      j <- Right(i + 100 * i + 10 * i).right
    } yield j

    println(result) // Right(666)
3.4 与其他类型的结合

Either 可以与其他类型结合使用, 例如: Option:

    val maybeValue: Option[Either[String, Int]] = Some(Right(10))

    val result = maybeValue match {
      case Some(Right(value)) => s"The value is $value ;"
      case Some(Left(error)) => s"There was an error: $error ;"
      case None => "There is no value !"
    }
    println(result) // Output: The value is 10 ;

4- 总结

Either 类型为 Scala 开发者提供了一种更优雅、更安全的方式来处理可能失败的操作 ;

它鼓励开发在代码中显式地处理成功和失败两种情况, 从而提高代码的健壮性和可读性 .

end

相关推荐

  1. Scala学习笔记18: Either 类型

    2024-07-18 21:04:04       25 阅读
  2. Scala学习笔记10: 特质

    2024-07-18 21:04:04       22 阅读
  3. Scala学习笔记16: 注解

    2024-07-18 21:04:04       19 阅读
  4. Scala学习笔记12: 高阶函数

    2024-07-18 21:04:04       32 阅读
  5. Scala学习笔记15: 文件和正则表达式

    2024-07-18 21:04:04       20 阅读
  6. Scala学习笔记17: Try与异常处理

    2024-07-18 21:04:04       23 阅读
  7. Scala学习笔记7: 对象

    2024-07-18 21:04:04       29 阅读
  8. Scala学习笔记8: 包

    2024-07-18 21:04:04       25 阅读
  9. Scala学习笔记9: 继承

    2024-07-18 21:04:04       28 阅读
  10. scala基础学习--变量,标识符,类型类型转换

    2024-07-18 21:04:04       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-18 21:04:04       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-18 21:04:04       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-18 21:04:04       62 阅读
  4. Python语言-面向对象

    2024-07-18 21:04:04       72 阅读

热门阅读

  1. org.quartz.SchedulerException: Couldn‘t get host name!

    2024-07-18 21:04:04       20 阅读
  2. Linux中的文件夹作用

    2024-07-18 21:04:04       24 阅读
  3. 子树的重心

    2024-07-18 21:04:04       23 阅读
  4. 网站流量统计分析工具之plausible.io

    2024-07-18 21:04:04       24 阅读
  5. 设计模式--享元模式

    2024-07-18 21:04:04       22 阅读
  6. ReferenceEquals

    2024-07-18 21:04:04       25 阅读
  7. 2024国家护网面试小结

    2024-07-18 21:04:04       22 阅读
  8. 数据结构第28节 字典树

    2024-07-18 21:04:04       21 阅读
  9. 详解深度学习中的epochs

    2024-07-18 21:04:04       23 阅读