scala中的Option

避免null的使用

大多数语言都有一个特殊的关键字或者对象表示一个对象的引用是“无”,在java里,它是null。在java里,null是一个关键字,不是一个对象,所以对它调用任何方法都是非法的。但是为什么要在程序员希望返回一个对象的时候,返回一个关键字呢?

Scala的Option类型

为了让所有东西都是对象的目标更加一致,也为了遵循函数式编程的习惯,scala鼓励你在变量和函数返回值可能不会引用任何值的时候使用Option类型。在没有值的时候,使用None,它是Option的一个子类;在有值的时候,就用Some来包含这个值,它也是Option的一个子类

例子1,认识Option的存在

scala> val map = Map("France"->"Paris", "Japan"->"Tokyo", "China"->"Beijing")
map: scala.collection.immutable.Map[String,String] = Map(France -> Paris, Japan -> Tokyo, China -> Beijing)

scala> map get "France"
res0: Option[String] = Some(Paris)

scala> map get "France2"
res1: Option[String] = None

从map里取值,如果取到了,则返回一个Some,如果没取到,则返回一个None

用途1,避免判断空

Option的一个非常惯用的做法是,把Option当成是一个集合看待,集合的大小是1或者是0,所以可以把map,filter,foreach等操作用在Option上

val name: Option[String] = request getParameter "name"
val upper = name map { _.trim } filter { _.length != 0 } map { _.toUpperCase }
println(upper getOrElse "")

这是Option官方给的一段代码,意思是从request中取出一个name值(但是name值可能是不存在的),然后对这个值去空格,去掉空值,转换为大写等一系列操作,最后拿到结果。

可以看到,这里没有任何if (name == null ) 或者 if (name.length == 0) 等这样的if语句,全是使用了scala推荐的函数式编程的写法,这种写法看起来更加scala,更简洁流畅,推荐这样写

 

用途2,使用模式匹配

使用模式匹配也能达到避免使用if的效果,下面再贴一个官方的代码

val nameMaybe = request getParameter "name"
nameMaybe match {
  case Some(name) =>
    println(name.trim.toUppercase)
  case None =>
    println("No name value")
}

有值时,走Some(name) 后的逻辑,没有值的时候,走None 的逻辑,看起来也是非常明确易懂

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值