基本数据结构
- 数组Array
数组本身的元素是有序的,可重复的,可变的
;
val numbers = Array(1,2,3,4,5)
numbers(1)
numbers(1) = 6
numbers
numbers: Array[Int] = Array(1, 6, 3, 4, 5)
res702: Array[Int] = Array(1, 6, 3, 4, 5)
- 列表List
列表本身的元素是有序的,可重复的,不可变的
;
val numbers = List(1,2,3,4,5)
numbers(1)
numbers(1) = 6
numbers
<console>:33: error: value update is not a member of List[Int]
numbers(1) = 6
- 集合Set
集合本身的元素是无序的,不可重复的,不可变的
scala> val numbers = Set(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
numbers: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)
- 元组Tuple
简单的逻辑集合
scala> val hostPort = ("localhost", 80)
hostPort: (String, Int) = (localhost, 80)
元组不通过index,而是根据下标来读取对象,而且下标起点为1,而不是0;
元组还有一个特殊的生成形式
scala> 1->2
res704: (Int, Int) = (1,2)
这个看起来就和Map的元素一样了,确实也是。
- 映射Map
可以用->
,也可以用元组形式来生成。
scala> Map(1->2)
res705: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)
scala> Map((1,2))
res710: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2)
scala> Map((1,2))==Map(1->2)
res711: Boolean = true
- Option
一个容器,其中有可能有包含的值;
scala> val numbers = Map("one" -> 1, "two" -> 2)
numbers: scala.collection.immutable.Map[java.lang.String,Int] = Map(one -> 1, two -> 2)
scala> numbers("one")
res712: Int = 1
scala> numbers("one1")
java.util.NoSuchElementException: key not found: one1
scala> numbers.get("123")
res714: Option[Int] = None
scala> numbers.get("one")
res715: Option[Int] = Some(1)
如果想要获得Map中的元素,直接调取元素可能会有exception,如果key错误的话;
但使用get就更安全,找不到就返回一个Option,其中可能有值Some(1),也可能没有None;
函数组合子(Functional Combinators)
这个概念就复杂多了。要精通短期来讲有点困难。。
组合子是一个概念,将复杂事物简单化的逻辑概念。
这个世界是数学概念组成的。
这句话可能大家比较能接受了吧。那换做这一句呢?
这个世界是函数组成的。
这个可能有点绕。那么将所有数学中的概念对应为函数。
概念:常数函数
公理:函数值为真的命题函数,y=f(x)=true
推理:上述函数组合而成的新函数,正确的话也为true
这个概念在此不需要理解太深(我觉得,也许是愚见:))。只需要记得,我们可以将一切事物转化成函数的形式。那么这么做的好处是?
我们可以把复杂的事情简单化,就像是:
expectedResult(x) = a(b(c(d(e...(x)))))
这里a,b,c...都是函数。
也就是说,我们对于某个基础内容x,可以进行一系列的操作,从而达到目的。典型的函数组合子如下(边学边理解吧,用文字比较难以形成感觉)。
- map
对列表的每一个元素应用一个函数,所以map这个函数本身是针对列表类型的,接受的参数为一个函数,f = element => trans_element,返回[trans_element]列表。
- foreach
和上面类似,但是它本身不会返回任何值,从而无法作为一种可链接的函数。它的作用需要取决于其参数函数的side effect。
- filter
参数函数是element => boolean的,也就是对每个元素做一个判断,符合条件的留下,否则舍弃。这种返回boolean值的函数也叫做谓词函数
。
- zip
合并两个列表,返回合并后的新列表。
- partition
接受一个谓词函数作为参数函数,返回[true_result, false_result]的分割列表。
- find
接受一个谓词函数作为参数函数,返回第一个true的元素。
- foldLeft/foldRight
def foldLeft [B] (z: B)(f: (B, A) => B): B//z需要提供,作为起步的初始值
def reduceLeft [B >: A] (f: (B, A) => B): B//特例,签名要求B是A的子类
从左往右,依次计算/更新结果B。比如List(1,2,3),从左往右求和,即:
List(1,2,3).reduceLeft(_ + _)
List(1,2,3).tail.foldLeft(List(1,2,3).head)(_ + _)
- flatten
将复合nested结构扁平化。
scala> Array(Array(1,2), Array(3,4,5)).flatten
res122: Array[Int] = Array(1, 2, 3, 4, 5)
- flatMap
先map再flatten。