1.集合
val(minors,adults)=people partition(_.age<18)
我们非常清楚这个操作做的事情:我们根据年龄,将people这个集合分成minors和adults两部分。由于partition方法是建立在根集合类型上,所以这代码在任何集合上都可以运行,当然包括数组。最后的结果minors和adults集合的数据类型和people集合一样这个代码比传统的分组的方式(建立一到三个循环,中间结果需要缓存)简介的多,partition方法更安全更快
2.解除绑定(拆解一个元组的看法)
解除数据绑定与模型匹配有关,当存在一个选择(option)时,他们使用相同的但可以接受的原理。在类别案例和元组中尤其有用
val tuple=('a',1)
val (char,digit)=tuple
val tweet=Tweet("just tweeting",Time.now )
val Tweet(text,timestamp)=tweet
3.Option
是一个容器类型,包含Some[T] or None,我们应该尽可能的使用Option而不是Null.Option是一个集合,我们可以对Option使用集合的操作符
对于
val username:String =null
...
username="foobar"
我们应该写
val username:Option[String]=None //Option[String] 这是一个String类型的容器,要么里面为 null,要么为Some(String)
...
username=Some("foobar")
后面的更加安全:Option将会静态的确保username会被检查是否为空值
对Option容器里面的值进行条件操作的时候,必须使用foreach
我们不能使用:其中的opt为option类型对象
if (opt.isDefined){
operate(opt.get)
}
我们应该写成
opt foreach{
value =>operate(value)
}
尽管后者看起来更蠢,实际上更加安全(我们不用调用opt.get方法)和简洁。
如果some(T)和null都会被用到,使用模型匹配
opt match{
case Some(value) =>operate(value)
case None => defaultAction()
}
如果大部分默认值是空值,我们可以使用opt.getOrElse()
val numbers=Map("one"->1,"two" ->2)
numbers.get("one") //res0:Option[Int]=Some(1)
numbers.get("three") //res1:Option[Int]=Null
res0.getOrElse(0)*2
4.函数组合子