1、数组
Scala数组与Scala序列是兼容的 - 在需要Seq[T]的地方可由Array[T]代替。最后,Scala数组支持所有的序列操作。
隐式转换
方法1:通过scala.collection.mutable.WrappedArray将数组转换成序列
/* ---示例代码----*/ scala> val va=Array(1,2,3)
va: Array[Int] = Array(1, 2, 3)
scala> val seq1:Seq[Int] = va
seq1: Seq[Int] = WrappedArray(1, 2, 3) /* ---示例代码----*/
方法2:通过scala.collection.mutable.ArrayOps类将数组添加到ArrayOps对象中,ArrayOps支持序列的所有方法
/* ---示例代码----*/ scala> val va=Array(1,2,3)
va: Array[Int] = Array(1, 2, 3)
scala> va.reverse
res2: Array[Int] = Array(3, 2, 1) /* ---示例代码----*/
方法2实现原理
数据在调用序列方法时会做隐式转换,通过调用implicit def genericArrayOps[T](xs: Array[T]): ArrayOps[T]方法,将数据添加到ArrayOps对象中
/* ---示例代码----*/ scala> val va=Array(1,2,3)
va: Array[Int] = Array(1, 2, 3)
scala> intArrayOps(va)
res3: scala.collection.mutable.ArrayOps[Int] = [I(1, 2, 3)
scala> res3.reverse
res5: Array[Int] = Array(3, 2, 1) scala> val ops:collection.mutable.ArrayOps[Int] = va
ops: scala.collection.mutable.ArrayOps[Int] = [I(1, 2, 3)
scala> ops.reverse
res0: Array[Int] = Array(3, 2, 1) /* ---示例代码----*/
数组泛型
没看懂
2、字符串
字符串不是直接序列,但可以转换成序列,与数据的转换方式类似,只是类型分别为WrappedString和scala.collection.immmutable.StringOps
3、容器的等价性
a、不同范畴的容器总是不能相等,即使有相同的元素也不相等,如:Set(1,2,3)与List(1,2,3)不等价。
b、同范畴下的容器相等的条件:具有相同元素并且元素具有相同顺序。如:List(1,2,3)==Vector(1,2,3) ,HashSet(1,2,3)==TreeSet(3,2,1)
可变容器做HashMap的key时,这是一个陷阱
/* ---示例代码----*/ scala> val s = Set(1,2,3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> val s1 = List(1,2,3)
s1: List[Int] = List(1, 2, 3)
scala> s == s1
res6: Boolean = false scala> var ss = collection.immutable.TreeSet(1,2,3)
ss: scala.collection.immutable.TreeSet[Int] = TreeSet(1, 2, 3)
scala> var ss1 = collection.immutable.HashSet(1,2,3)
ss1: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3)
scala> ss ==ss1
res7: Boolean = true scala> import collection.mutable.{HashMap,ArrayBuffer}
import collection.mutable.{HashMap, ArrayBuffer}
scala> val buf = ArrayBuffer(1,2,3)
buf: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)
scala> val map = HashMap(buf -> 5)
map: scala.collection.mutable.HashMap[scala.collection.mutable.ArrayBuffer[Int],Int] = Map(ArrayBuffer(1, 2, 3) -> 5)
scala> map(buf)
res8: Int = 5
scala> buf(0) += 2
scala> map(buf)
java.util.NoSuchElementException: key not found: ArrayBuffer(3, 2, 3)
/* ---示例代码----*/
4、懒加载实现原理
容器中自带一些方法,对容器给入的参数进行加工处理转换成新的容器,称这些方法为转换器。如(map,filter,++)。
实现转换器有两种途径,一个叫紧凑法,另一个叫懒惰法(lazy)或松弛法。
紧凑法,就是一个容器及其所有单元构造成这个转换器(transformers)。
惰性法(lazy),就是一个容器及其所有单元仅仅是构造了结果容器的代理,并且结果容器的每个单元都是按单一需求构造的。
注:这两个概念不太好理解
个人理解:
紧凑法:就是每调一次方法就会立即执行并返回结果,然后再继续执行下一个方法。
惰性法:每次调用方法时只返回一个结果的代理,这个结果并没有真正处理数据,只有执行到最的一个强制性方法时,才会真正去执行。
/* ---示例代码----*/ scala> val v =Vector(1 to 10: _*)
v: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
scala> v map (_ + 1) map(_* 2)
res11: scala.collection.immutable.Vector[Int] = Vector(4, 6, 8, 10, 12, 14, 16, 18, 20, 22) scala> val vv = v.view
vv: scala.collection.SeqView[Int,scala.collection.immutable.Vector[Int]] = SeqView(...)
scala> val vvv = vv map(_+2) map(_*2)
vvv: scala.collection.SeqView[Int,Seq[_]] = SeqViewMM(...)
scala> vvv.force
res12: Seq[Int] = Vector(6, 8, 10, 12, 14, 16, 18, 20, 22, 24) /* ---示例代码----*/