Scala之Option

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

                       

机场等飞机,继续学习Scala~~ 本文原文出处: http://blog.youkuaiyun.com/bluishglc/article/details/51290759 严禁任何形式的转载,否则将委托优快云官方维护权益!

Option是一个很有意思的类,首先,这个类并不一个真正的集合类,因为它并没有有继承Traversable或Iterable。但是,它确实具有Iterable的所有操作,这意味着你完全可以把Option当成一个集合去使用,其中原因你应该可以猜的到,这显然是隐式转换在起作用。具体来说是Option的伴生对象中定义了一个隐式转化函数option2Iterable, 你还记得隐式解析的作用域吗?伴生对象也是编译器针对类型进行隐式转换解析时查找的作用域,也就是说:当你试图把Option当成一个Iterable使用时,编译器是在Option的伴生对象的option2Iterable方法上找到了这个隐式转化声明:

implicit def option2Iterable[A](xo: Option[A]): Iterable[A]
  
  • 1
  • 2

从而确认了从Option向Iterable的隐式转化是定义好的。(至于另外的4个隐式转换:by any2stringadd, by any2stringfmt, by any2ArrowAssoc, by any2Ensuring是发生在PreDef中的,这4个是面向全局的任何类型的隐式转换。

其次,我们来看一下这个类两个子类:

First, it is far more obvious to readers of code that a variable whose type
is Option[String] is an optional String than a variable of type String,
which may sometimes be null. But most importantly, that programming
error described earlier of using a variable that may be null without first
checking it for null becomes in Scala a type error. If a variable is of type
Option[String] and you try to use it as a String, your Scala program will
not compile.

  1. Option具有更直白的语义:它代表的值可能是一个具体的值,但也可能是空!
  2. 在Java里判空是一个运行时的动作,因此经常会出现忘记判空导致的空指针异常。但是在scala里,由于Option的引入,在你试图使用Option里的值时,你必选做相应的类型转换,否则就会出现编译错误,这是引入Option另一个重要目的,在编译期进行判空处理!

比如:当你声明一个Option[String]变量时,从语义上你就已经告知了编译器,包括读者,这个变量可能是一个String也可能是空,但是在试图实际读取这个值时,你必须先进行类型转换和判空处理,否则编译就无法通过,这是使用Option的主要同目的。

Option在Scala里被广泛使用,主要有如下场景:

  • Using Option in method and constructor parameters
  • Using Option to initialize class fields (instead of using null)
  • Converting null results from other code (such as Java code) into an Option 

  • Returning an Option from a method

  • Getting the value from an Option
  • Using Option with collections
  • Using Option with frameworks
  • Using Try/Success/Failure when you need the error message (Scala 2.10 and
    newer)
  • Using Either/Left/Right when you need the error message (pre-Scala 2.10)

其次,我们来看一下这个类两个子类:

Returning an Option from a method

def toInt(s: String): Option[Int] = {    try {        Some(Integer.parseInt(s.trim))    } catch {        case e: Exception => None    }}
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
scala> val x = toInt("1")x: Option[Int] = Some(1)scala> val x = toInt("foo")x: Option[Int] = None 
  
  • 1
  • 2
  • 3
  • 4

Getting the value from an Option

这里有三个类子演示从一个Option里提取值:

Use getOrElse

scala> val x = toInt("1").getOrElse(0)x: Int = 1
  
  • 1
  • 2

getOrElse:顾名思义,对于一个Option,如有它确实有值就返回值,否则,也就是为空的话,给一个约定的值。

Use foreach

由于是Option可以被隐式转换为Iterable,这意味着你可以把它当成一个普通的集合那样去使用,使用foreach去迭代一个Option就是非常典型的例子。

toInt("1").foreach{ i =>    println(s"Got an int: $i")}
  
  • 1
  • 2
  • 3

Use a match expression

toInt("1") match {    case Some(i) => println(i)    case None => println("That didn't work.")}
  
  • 1
  • 2
  • 3
  • 4
           

分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

### 关于 Scala 中 `Option` 的用法 在 Scala 编程语言中,`Option` 是一种用于处理可能为空值的数据结构。它通过封装两种状态——存在值 (`Some`) 和不存在值 (`None`) 来提供更安全的方式替代传统的 null 值检查机制[^1]。 #### 什么是 `Option`? `Option` 类型是一个容器类型,表示可能存在或者不存在的值。它的两个子类型分别是: - **`Some[T]`**: 表示包含某个具体类型的值。 - **`None`**: 表示不包含任何值。 这种设计使得开发者能够显式地表达某些变量可能会缺失的情况,从而减少因空指针异常引发的错误。 #### 如何创建 `Option`? 可以通过以下几种方式创建 `Option` 对象: ```scala val someValue: Option[Int] = Some(42) // 创建一个包含整数 42 的 Option 实例 val noValue: Option[String] = None // 创建一个不含任何字符串值得 Option 实例 ``` #### 基本操作方法 以下是几个常用的针对 `Option` 进行的操作及其解释: 1. **`getOrElse(default)`** 如果 `Option` 包含实际值,则返回该值;否则返回指定默认值。 ```scala val result = someValue.getOrElse(0) // 返回 42 ``` 2. **`isDefined` / `isEmpty`** 判断是否存在有效值或是否为空。 ```scala println(someValue.isDefined) // 输出 true println(noValue.isEmpty) // 输出 true ``` 3. **`map(f)`** 当前 `Option` 存在值时应用给定函数 f 并返回新的 `Option`; 否则直接返回 `None`. ```scala val doubled = someValue.map(_ * 2) // 结果为 Some(84) ``` 4. **`flatMap(f)`** 类似 map, 不过其内部会自动解包嵌套层 (即从 Option[Option[A]] 转化成 Option[A]). ```scala def getSquare(x: Int): Option[Int] = Some(x*x) val squaredAndDoubled = someValue.flatMap(getSquare).map(_*2) // 结果为 Some(336) ``` 5. **`foreach(f)`** 遍历并执行副作用动作(如打印),仅当选项非空时才生效。 ```scala someValue.foreach(v => println("The value is:" + v)) ``` 以上就是有关如何利用 Scala 提供的功能强大又灵活易懂的 Optional 容器的一些基本概念与实践技巧[^2]. #### 示例代码展示 下面给出一段综合运用上述知识点的小例子: ```scala object OptionExample { def divide(a: Double, b: Double): Option[Double] = if(b != 0) Some(a/b) else None def main(args: Array[String]): Unit = { val dividend = 10d val divisor = 2d val divisionResult = divide(dividend,divisor) divisionResult match{ case Some(result) => println(s"$dividend divided by $divisor equals ${result}") case None => println("Division failed due to zero denominator.") } } } ``` 此程序演示了除法运算过程中可能出现零作分母的情形,并借助 `Option` 成功规避潜在风险的同时保持逻辑清晰简洁明了.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值