前情提要:
Scala函数式编程专题—— 函数式思想介绍
scala函数式编程专题——scala基础语法介绍
前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的,主要会介绍集合和函数。
注意噢,函数和方法是不一样的,方法是在类里面定义的,函数是可以单独存在的(严格来说,在scala内部,每个函数都是一个类)
一.scala集合介绍
还记得上一章介绍的object的apply方法吗,很多数据结构其实都用到了它,从而让我们可以直接用List(...)这样来新建一个List,而不用自己手动new一个。
PS:注意,scala默认的数据结构都是不可变的,就是说一个List,没法删除或增加新的元素。当然,也有“可变”的数据结构,后面会介绍到。
1.1 List
得益于apply方法,我们可以不通过new来新建数据结构。
//通过工厂,新建一个List,这个List是不可变的 scala> val numbers = List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5) numbers: List[Int] = List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
1.2 元组Tuple
Tuple这个概念在python应用比较广泛,它可以将多种数据类型(Int,String,Double等)打包在一起
scala> val tup = (1,1,2.1,"tuple",'c') //将多种不同数据结构打包一起,可以有重复 tup: (Int, Int, Double, String, Char) = (1,1,2.1,tuple,c)
但在scala中,Tuple是有长度限制的,那就是一个Tuple最多只能有22个元素。
scala> val tup = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21) tup: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21) //一个Tuple超过22个元素,报错了 scala> val tup = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22) <console>:1: error: too many elements for tuple: 23, allowed: 22 val tup = (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22)
可以看到上面,一但一个Tuple超过22个元素,就会报错了。至于为什么是22这个神奇的数字,好像一直没有一个统一的论调。有人开玩笑的说23才对,因为有部电影的名字叫《The Number 23》~~
1.3 Map和Option
在说Map之前,需要先介绍Option,因为Map里面存的就是Option,这个后面介绍。
Option翻译过来是选项,本质上,它也确实是一个选项,用来告诉你存不存在。还是用实例说明吧:
//Option里面可以存普通数据类型
scala> val optionInt = Option(1)
optionInt: Option[Int] = Some(1)
scala> optionInt.get
res8: Int = 1
//但一个Option也可能为空
scala> val optionNone = Option(null)
optionNone: Option[Null] = None
//当Option里面是空的时候,是get不出东西的,还会报错
scala> optionNone.get
java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:347)
at scala.None$.get(Option.scala:345)
... 32 elided
//这个时候可以判断它就是空的
scala> optionNone.isEmpty
res11: Boolean = true
//但可以用getOrElse()方法,当Option里面有东西的时候,就返回那个东西,如果没有东西,就返回getOrElse()的参数的内容
scala> optionNone.getOrElse("this is null") //里面没东西
res12: String = this is null
scala> optionInt.getOrElse("this is null") //里面有东西
res15: Any = 1









