【Scala入门学习】Scala的数据结构

1. 前言:

在scala 编程中经常需要用到各种数据结构,比如数组(Array)、元组(Tuple)、列表(List)、映射(Map)、集合(Set)等。

Scala同时支持可变集合和不可变集合,不可变集合从不可变,可以安全的并发访问;

不可变集合:scala.collection.immutable

可变集合: scala.collection.mutable

Scala优先采用不可变集合,对于几乎所有的集合类,Scala都同时提供了可变和不可变的版本;

2. 数组(Array / ArrayBuffer)

数组是一种可变的、可索引的、元素具有相同类型的数据集合;

分为定长和变长的,也就是可以改变长度和固定长度的(同样 集合、映射、元组也分为定长和变长);

定长不用引用第3方的包,变长需要引用;

1)定长数组

// 静态初始化
// 在Array的object对象中有apply方法(就是创建对象的),不需要new关键字了
scala> val arr = Array[Int](1,2,3)
arr: Array[Int] = Array(1, 2, 3) 
// 动态初始化
scala> val arr1 = new Array[Int](3)
arr1: Array[Int] = Array(0, 0, 0)
// 获取数组长度
scala> arr.size
res32: Int = 3
// 获取数组元素, 下标从0开始,用()括起来
scala> arr(0)
res33: Int = 1
// 不可变数组可以修改元素
scala> arr(0) = 10
scala> println(arr)
[I@49825659
// 通过toBUffer来看到内部数据
scala> println(arr.toBuffer)
ArrayBuffer(10, 2, 3)
// 数组内部存储的类型是一致的,如果不一致,就找公共的类型
scala> val arr = Array(1,"aa",Array[Int](1,2,3))
arr: Array[Any] = Array(1, aa, Array(1, 2, 3))
scala> arr(2)
res37: Any = Array(1, 2, 3)
scala> arr(2)(1)
<console>:13: error: Any does not take parameters
       arr(2)(1)
             ^
// Any类型什么也干不了,需要强转成指定类型
scala> res37.asInstanceOf[Array[Int]]
res39: Array[Int] = Array(1, 2, 3)
scala> res39(1)
res40: Int = 2
scala> val arr = Array[Int](1,4,2,5,6,7)
arr: Array[Int] = Array(1, 4, 2, 5, 6, 7)
// 升序排序
scala> arr.sorted
res41: Array[Int] = Array(1, 2, 4, 5, 6, 7)
// 降序排序
scala> arr.sorted.reverse
res42: Array[Int] = Array(7, 6, 5, 4, 2, 1)
// 聚合函数
scala> arr.sum
res43: Int = 25
scala> arr.max
res45: Int = 7
scala> arr.min
res46: Int = 1
// 数组元素遍历
scala> for(i <- arr) print(s"${i} ")
1 4 2 5 6 7
scala>
// 数组下标方式遍历
scala> for(i <- 0 until arr.size) print(s"${arr(i)} ")
1 4 2 5 6 7
scala> arr.size
res49: Int = 6
scala> arr.length
res50: Int = 6

// 数组和yield产生新数组
scala> for(i <- arr) yield i * 10
res51: Array[Int] = Array(10, 40, 20, 50, 60, 70)

数组上面的方法

scala> Array.ofDim[Int](2,3)
res37: Array[Array[Int]] = Array(Array(0, 0, 0), Array(0, 0, 0))

scala> res37(0)(1)
res38: Int = 0

scala> res37(0)(1) = 111

scala> res37
res40: Array[Array[Int]] = Array(Array(0, 111, 0), Array(0, 0, 0))

scala> 

scala> val arr = Array(1,2,3,4,5)
arr: Array[Int] = Array(1, 2, 3, 4, 5)

scala> arr.
++    clone   diff   flatten   indexOfSlice    lastIndexWhere   padTo       repr      sliding   takeWhile       toVector       
++:   collect    distinct       fold      indexWhere   lastOption       par    reverse   sortBy    to      transform      
+:    collectFirst    drop   foldLeft     indices      length   partition   reverseIterator   sortWith       toArray    transpose      
/:    combinations    dropRight      foldRight    init    lengthCompare    patch       reverseMap   sorted    toBuffer   union     
:+    companion       dropWhile      forall    inits   lift     permutations   runWith   span   toIndexedSeq    unzip     
:\    compose    elemManifest   foreach   intersect    map      prefixLength   sameElements      splitAt   toIterable      unzip3    
addString     contains   elemTag   genericBuilder    isDefinedAt     max      product     scan      startsWith     toIterator      update    
aggregate     containsSlice   endsWith       groupBy   isEmpty      maxBy    reduce      scanLeft     stringPrefix   toList     updated   
andThen       copyToArray     exists    grouped   isTraversableAgain   min      reduceLeft     scanRight    sum    toMap   view   
apply    copyToBuffer    filter    hasDefiniteSize   iterator     minBy    reduceLeftOption    segmentLength     tail   toSeq   withFilter     
applyOrElse   corresponds     filterNot      head      last    mkString    reduceOption   seq       tails     toSet   zip    
array    count   find   headOption   lastIndexOf     nonEmpty    reduceRight    size      take   toStream   zipAll    
canEqual      deep    flatMap   indexOf   lastIndexOfSlice     orElse   reduceRightOption   slice     takeRight      toTraversable   zipWithIndex  

scala> arr.length
res41: Int = 5

scala> arr.contains(1)
res42: Boolean = true

scala> arr.distinct
res43: Array[Int] = Array(1, 2, 3, 4, 5)

scala> val arr = Array(1,1,1,1,2,3,4,5)
arr: Array[Int] = Array(1, 1, 1, 1, 2, 3, 4, 5)

scala> arr.distinct
res44: Array[Int] = Array(1, 2, 3, 4, 5)

scala> arr.head
res45: Int = 1

scala> arr.tail
res46: Array[Int] = Array(1, 1, 1, 2, 3, 4, 5)

scala> arr.tail.tail.tail.tail
res47: Array[Int] = Array(2, 3, 4, 5)

scala> arr.indexOf(3)
res48: Int = 5

scala> arr.indexOf(1)
res49: Int = 0

scala> arr.lastIndexOf(1)
res50: Int = 3

scala> arr.max
res51: Int = 5

scala> arr.min
res52: Int = 1

scala> arr.mkString("*")
res53: String = 1*1*1*1*2*3*4*5

scala> arr.reverse
res54: Array[Int] = Array(5, 4, 3, 2, 1, 1, 1, 1)

scala> arr
res55: Array[Int] = Array(1, 1, 1, 1, 2, 3, 4, 5)

scala> arr.reverse.head
res56: Int = 5

scala> arr.size
res57: Int = 8

scala> arr.take(3)
res58: Array[Int] = Array(1, 1, 1)

scala> arr.slice(3,2)
res59: Array[Int] = Array()

scala> arr.slice(3,4)
res60: Array[Int] = Array(1)

scala> arr.slice(3,5)
res61: Array[Int] = Array(1, 2)

scala> arr
res62: Array[Int] = Array(1, 1, 1, 1, 2, 3, 4, 5)

scala> arr:+4
res63: Array[Int] = Array(1, 1, 1, 1, 2, 3, 4, 5, 4)

scala> 4+:arr
res64: Array[Int] = Array(4, 1, 1, 1, 1, 2, 3, 4, 5)

scala> arr
res65: Array[Int] = Array(1, 1, 1, 1, 2, 3, 4, 5)

scala> for(i<-arr)
     | println(i)
1
1
1
1
2
3
4
2)变长数组

不能直接使用,需要引用ArrayBuffer这个类,不引入就找不到这个类

scala> buffer:+1
res1: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1)

scala> 2+:buffer
res2: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(2)

scala> buffer
res3: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

scala> buffer += 1
res4: buffer.type = ArrayBuffer(1)

scala> buffer
res5: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1)

scala> buffer -= 1
res6: buffer.type = ArrayBuffer()

scala> buffer ++= Array(1,2,3,4,5,6)
res7: buffer.type = ArrayBuffer(1, 2, 3, 4, 5, 6)

scala> buffer --= Array(1,2,3)
res8: buffer.type = ArrayBuffer(4, 5, 6)

scala> buffer.insert(0,111,222,333)

scala> buffer
res10: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(111, 222, 333, 4, 5, 6)

scala> buffer.remove
   def remove(n: Int): Int   override def remove(n: Int,count: Int): Unit

scala> buffer.remove(0)
res11: Int = 111

scala> buffer.remove(0,2)

scala> buffer
res13: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(4, 5, 6)

定长数组与变长数组的相互转换

scala> val arr = Array[Int](1,2,3)
arr: Array[Int] = Array(1, 2, 3)
// Array ---> ArrayBuffer
scala> arr.toBuffer
res65: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3)
// ArrayBuffer ---> Array
scala> res65.toArray
res66: Array[Int] = Array(1, 2, 3)

3. 元组

scala 的元组是对多个不同类型对象的一种简单封装。Scala 提供了TupleN 类(N的范围为1 \~ 22),用于创建一个包含N个元素的元组。

scala> val tp:Tuple3[Int,String,Int] = new Tuple3[Int,String,Int](1,"zhangsan",20)
tp: (Int, String, Int) = (1,zhangsan,20)

scala> val tp = new Tuple2[String,Int]("zhangsan",20)
tp: (String, Int) = (zhangsan,20)

scala> val tp = ("zhangsan",20)
tp: (String, Int) = (zhangsan,20)

scala> val tp = (1,"zhangsan",20)
tp: (Int, String, Int) = (1,zhangsan,20)

scala> tp._1
res17: Int = 1

scala> tp._2
res18: String = zhangsan

scala> tp._3
res19: Int = 20

scala> tp._2 = "zhaosi"
<console>:13: error: reassignment to val
       tp._2 = "zhaosi"

构造元组只需把多个元素用逗号隔开并用圆括号括起来。

元组取值时应该按照元祖的属性取值,属性值_N(1-22),而数组的下标是从0开始的,要注意区别;

scala> val tp = (1,"zhangsan",20,Array(100,120,119))
tp: (Int, String, Int, Array[Int]) = (1,zhangsan,20,Array(100, 120, 119))

scala> tp._4(1)
res20: Int = 120

scala> val tp = ()
tp: Unit = ()

scala> val tp = (1,"zhangsan",("math",100),("chinese",120))
tp: (Int, String, (String, Int), (String, Int)) = (1,zhangsan,(math,100),(chinese,120))

scala> tp._4._2
res21: Int = 120

scala> 

scala> val tp = ("zhangsan","lisi")
tp: (String, String) = (zhangsan,lisi)

scala> tp.swap
res22: (String, String) = (lisi,zhangsan)

scala> val arr = Array("zhangsan","lisi","zhaosi")
arr: Array[String] = Array(zhangsan, lisi, zhaosi)

scala> val arr1 = Array(2000,3000,4500,1000)
arr1: Array[Int] = Array(2000, 3000, 4500, 1000)

scala> arr zip arr1
res23: Array[(String, Int)] = Array((zhangsan,2000), (lisi,3000), (zhaosi,4500))

scala> arr
res24: Array[String] = Array(zhangsan, lisi, zhaosi)

scala> arr.zipWithIndex
res25: Array[(String, Int)] = Array((zhangsan,0), (lisi,1), (zhaosi,2))

4. 列表

1)不可变列表

不可变列表:元素和长度都不可变

// 不可变列表:元素和长度都不可变
scala> val list = List[Int](1,2,3)
list: List[Int] = List(1, 2, 3)
scala> list(1)
res19: Int = 2
// 元素不可变
scala> list(1) = 10
<console>:13: error: value update is not a member of List[Int]
       list(1) = 10
       ^
scala> list.size
res21: Int = 3

但可以产生新的列表

scala> val list2 = List(1,2,3)
list2: List[Int] = List(1, 2, 3)
// 在list2 前面加 0 ---> List(0, 1, 2, 3)
scala> list2.::(0)
scala> list2.+:(0)
scala> 0 :: list2
scala> 0 +: list2
// 在list2 后面加 0 ---> List(1, 2, 3, 0)
scala> list2.:+(0)
scala> list2 :+ 0
// 合并两个list并生成新的list
scala> list2 ::: List(2,3,4)
res29: List[Int] = List(1, 2, 3, 2, 3, 4)
scala> list2 ++ List(2,3,4)
res30: List[Int] = List(1, 2, 3, 2, 3, 4)

// Nil 代表空列表
scala> Nil
res31: scala.collection.immutable.Nil.type = List()
scala> 0 :: 1 :: Nil
res32: List[Int] = List(0, 1)
// 需要主动引入可变列表
scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer
scala> val list = new ListBuffer[Int]
list: scala.collection.mutable.ListBuffer[Int] = ListBuffer()
// 添加元素
scala> list.append(1)
// 在指定位置插入
scala> list.insert(0, -1)
// + 用来加元素和元组
scala> list += 2
res15: list.type = ListBuffer(-1, 1, 2)
scala> list += (3,4)
res16: list.type = ListBuffer(-1, 1, 2, 3, 4)
// ++ 用来++同类(序列)
scala> list ++= Array(5,6)
res17: list.type = ListBuffer(-1, 1, 2, 3, 4, 5, 6)
scala> list ++= List(7,8)
res18: list.type = ListBuffer(-1, 1, 2, 3, 4, 5, 6, 7, 8)
// 删除元素, 减下标元素
scala> list.remove(0)
res19: Int = -1
scala> list.size
res20: Int = 8
// -- 用来--同类(序列)
scala> list --= List(7,8)
res21: list.type = ListBuffer(1, 2, 3, 4, 5, 6)
scala> list --= Array(5,6)
res22: list.type = ListBuffer(1, 2, 3, 4)
// - 用来减元素和元组
scala> list -= (1,2)
res23: list.type = ListBuffer(3, 4)
scala> list -= 3
res24: list.type = ListBuffer(4)

2)可变列表

// 需要主动引入可变列表
scala> import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ListBuffer
scala> val list = new ListBuffer[Int]
list: scala.collection.mutable.ListBuffer[Int] = ListBuffer()
// 添加元素
scala> list.append(1)
// 在指定位置插入
scala> list.insert(0, -1)
// + 用来加元素和元组
scala> list += 2
res15: list.type = ListBuffer(-1, 1, 2)
scala> list += (3,4)
res16: list.type = ListBuffer(-1, 1, 2, 3, 4)
// ++ 用来++同类(序列)
scala> list ++= Array(5,6)
res17: list.type = ListBuffer(-1, 1, 2, 3, 4, 5, 6)
scala> list ++= List(7,8)
res18: list.type = ListBuffer(-1, 1, 2, 3, 4, 5, 6, 7, 8)
// 删除元素, 减下标元素
scala> list.remove(0)
res19: Int = -1
scala> list.size
res20: Int = 8
// -- 用来--同类(序列)
scala> list --= List(7,8)
res21: list.type = ListBuffer(1, 2, 3, 4, 5, 6)
scala> list --= Array(5,6)
res22: list.type = ListBuffer(1, 2, 3, 4)
// - 用来减元素和元组
scala> list -= (1,2)
res23: list.type = ListBuffer(3, 4)
scala> list -= 3
res24: list.type = ListBuffer(4)

注意:在可变list上也可以调用不可变list的“::”,“+:”,“:+”,“++”,“:::”,区别是可变list返回的是新的ListBuffer,不可变list返回的是新的List。

:: 在列表前面添加 【ListBuffer 不可用】

+: 在列表前面添加

:+ 在列表后面添加

++ 两个列表拼接

::: 两个列表拼接 【ListBuffer 不可用】

scala> val list = ListBuffer(1,2,3)
list: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3)
// :: ::: 在可变列表中用不了
scala> 0 :: list
<console>:14: error: value :: is not a member of scala.collection.mutable.ListBuffer[Int]
       0 :: list
         ^
scala> 0 +: list
res27: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3)
scala> list :+ 0
res28: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 0)
scala> list ++ List(4,5)
res29: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4, 5)
scala> list ::: List(4,5)
<console>:14: error: type mismatch;
 found   : scala.collection.mutable.ListBuffer[Int]
 required: List[?]
       list ::: List(4,5)
            ^

3)ListBuffer 、 List、ArrayBuffer、Array的转换

file

5. 集合

特性:去重

1)不可变set

scala> val set = Set(1,2,3)
set: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> set.size
res36: Int = 3
// 获取第一个元素
scala> set.head
res37: Int = 1
// 获取除了第一个元素以外的其他元素组成的set
scala> set.tail
res38: scala.collection.immutable.Set[Int] = Set(2, 3)
// 判断集合是否为空
scala> set.isEmpty
res40: Boolean = false
// 使用不可变的HashSet,需要引入不可变HashSet
scala> val set = HashSet(1,2,3)
<console>:12: error: not found: value HashSet
       val set = HashSet(1,2,3)
                 ^
scala> import scala.collection.immutable.HashSet
import scala.collection.immutable.HashSet
scala> val set = HashSet(1,2,3)
set: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3)
scala> set.size
res41: Int = 3

// 不可变set可以产生新的set集合
scala> set + 1
res42: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3)
scala> set + 4
res43: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3, 4)
scala> set ++ Set(3,5)
res44: scala.collection.immutable.HashSet[Int] = Set(5, 1, 2, 3)

2)可变set

// 引入不可变HashSet
scala> import scala.collection.immutable.HashSet
import scala.collection.immutable.HashSet
scala> val set = HashSet(1,2,3)
set: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3)

// 引入可变HashSet
scala> import scala.collection.mutable.HashSet
import scala.collection.mutable.HashSet
// 报错原因是当前有两个HashSet, 创建对象不知道用哪个
scala> val set = new HashSet[Int]
<console>:14: error: reference to HashSet is ambiguous;
it is imported twice in the same scope by
import scala.collection.mutable.HashSet
and import scala.collection.immutable.HashSet
       val set = new HashSet[Int]
                     ^
// 冲突了,起别名,用别名来创建对象
scala> import scala.collection.mutable.{HashSet => HashSetMu}
import scala.collection.mutable.{HashSet=>HashSetMu}
scala> val set = new HashSetMu[Int]
set: scala.collection.mutable.HashSet[Int] = Set()

// 可变集合的添加
scala> set.add(1)
res45: Boolean = true
scala> set.add(1)
res46: Boolean = false
scala> set += 2
res47: set.type = Set(1, 2)
scala> set += (3,4)
res48: set.type = Set(1, 2, 3, 4)
scala> set ++= Set(4,5)
res49: set.type = Set(1, 5, 2, 3, 4)
scala> println(set)
Set(1, 5, 2, 3, 4)

// 因为set不按照下标取遍历, remove减的是元素
scala> set.remove(5)
res51: Boolean = true
scala> set -= 1
res52: set.type = Set(2, 3, 4)
scala> set -= (2,3)
res53: set.type = Set(4)
scala> set --= Set(4)
res54: set.type = Set()
scala> set.isEmpty
res55: Boolean = true

6.5 映射

映射也就是一个hash表,相当于java里的map。

1)不可变map

// 创建不可变map对象
// kv键值对:可以用 k -> v 表示, 也可以用 (k, v) 表示
scala> val map = Map("a"->1, "b"->(1,2), ("c",3))
map: scala.collection.immutable.Map[String,Any] = Map(a -> 1, b -> (1,2), c -> 3)
scala> map.size
res0: Int = 3
// 获取key对应的value 
scala> map("a")
res1: Any = 1
// 强转
scala> res0.asInstanceOf[Int]
res2: Int = 1
// 不可变map不能修改元素 
scala> map("a") = 10
<console>:13: error: value update is not a member of scala.collection.immutable.Map[String,Any]
       map("a") = 10
       ^
// 获取时如果key不存在,抛异常
scala> map("d")
java.util.NoSuchElementException: key not found: d
  at scala.collection.MapLike$class.default(MapLike.scala:228)
  at scala.collection.AbstractMap.default(Map.scala:59)
  at scala.collection.MapLike$class.apply(MapLike.scala:141)
  at scala.collection.AbstractMap.apply(Map.scala:59)
  ... 32 elided
// 解决方案1: 通过get方法,获取Option对象
// Option 对象有两个子类:
// None:代表没数据
//  Some: 代表有数据, 可通过get() 提取Some对象里的数据
scala> map.get("d")
res5: Option[Any] = None
// 获取对应的Option对象
scala> map.get("a")
res6: Option[Any] = Some(1)
// 提取数据
scala> res6.get
res7: Any = 1
// 解决方案2:通过getOrElse方法,如果key不存在,将设置的默认值返回
scala> map.getOrElse("d", "default value")
res8: Any = default value    

不可变 Map 内部元素不可变,但可以产生新的Map

scala> val map = Map("a"->1)
map: scala.collection.immutable.Map[String,Int] = Map(a -> 1)
scala> map + ("b"-> 2)
res9: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)
scala> map + (("c", 3))
res10: scala.collection.immutable.Map[String,Int] = Map(a -> 1, c -> 3)
scala> map ++ Map("d"-> 4)
res11: scala.collection.immutable.Map[String,Int] = Map(a -> 1, d -> 4)
scala> res9 - "b"
res12: scala.collection.immutable.Map[String,Int] = Map(a -> 1)
scala> res11 - ("d")
res13: scala.collection.immutable.Map[String,Int] = Map(a -> 1)

2)可变map

添加删除数据

// 引入可变的HashMap
scala> import scala.collection.mutable.HashMap
import scala.collection.mutable.HashMap
scala> val map = new HashMap[String,Int]
map: scala.collection.mutable.HashMap[String,Int] = Map()

// 添加数据
scala> map.put("a",1)
res69: Option[Int] = None
scala> println(map)
Map(a -> 1)
scala> map += ("b"-> 2)
res71: map.type = Map(b -> 2, a -> 1)
scala> map += (("c", 3))
res72: map.type = Map(b -> 2, a -> 1, c -> 3)
scala> map ++= Map("d"-> 4)
res73: map.type = Map(b -> 2, d -> 4, a -> 1, c -> 3)
// 删除数据
scala> map.remove("a")
res74: Option[Int] = Some(1)
scala> res74.get
res75: Int = 1
scala> map -= "b"
res76: map.type = Map(d -> 4, c -> 3)
scala> map -= ("c","d")
res77: map.type = Map()
scala> map.isEmpty
res79: Boolean = true

遍历map

// 遍历map
scala> val map = HashMap("b" -> 2, "d" -> 4, "a" -> 1, "c" -> 3)
map: scala.collection.mutable.HashMap[String,Int] = Map(b -> 2, d -> 4, a -> 1, c -> 3)
// 以keyset的方式根据key找value
scala> for(k <- map.keySet)println(s"k:${k}, v:${map(k)}")
k:b, v:2
k:d, v:4
k:a, v:1
k:c, v:3
// 直接遍历一组k,v
scala> for((k,v) <- map)println(s"k:${k}, v:${v}")
k:b, v:2
k:d, v:4
k:a, v:1
k:c, v:3
// 遍历value
scala> for(v <- map.values)println(s"v:${v}")
v:2
v:4
v:1
v:3

利用集合进行组合赋值

scala> val a = 1
a: Int = 1

scala> val b = 2
b: Int = 2

scala> val c = 3
c: Int = 3

scala> val List(a,b,c) = List(1,2,3)
a: Int = 1
b: Int = 2
c: Int = 3

scala> val Array(a,b,c) = Array(1,2,3)
a: Int = 1
b: Int = 2
c: Int = 3

scala> val Array(a,b,c) = Array(1,2,"a")
a: Any = 1
b: Any = 2
c: Any = a

scala> val (a,b,c) = (1,2,3)
a: Int = 1
b: Int = 2
c: Int = 3

scala> val (a,b,c) = (1,2,"a")
a: Int = 1
b: Int = 2
c: String = a

scala> val Set(a,b,c)=Set(1,2,3)
<console>:23: error: object Set is not a case class, nor does it have an unapply/unapplySeq member
       val Set(a,b,c)=Set(1,2,3)
           ^

scala> val list,List(a,b,c) = List(1,2,3)
list: List[Int] = List(1, 2, 3)
a: Int = 1
b: Int = 2
c: Int = 3

toMap操作——将对偶的数组转换成map

// 对偶数组
scala> val arr1 = Array(("a",1), ("b",2))
arr1: Array[(String, Int)] = Array((a,1), (b,2))
scala> arr1.toMap
res86: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)

// 对偶列表
scala> val list = List(("a",1), ("b",2))
list: List[(String, Int)] = List((a,1), (b,2))
scala> list.toMap
res87: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)

zip操作(拉链操作),通过拉链操作得到对偶数组或列表

ZipWithIndex

scala> val arr1 = Array("a", "b", "c")
arr1: Array[String] = Array(a, b, c)
scala> val arr2 = Array(1,2)
arr2: Array[Int] = Array(1, 2)
// 通过拉链得到对偶数组,如果对不齐就舍去
scala> arr1.zip(arr2)
res88: Array[(String, Int)] = Array((a,1), (b,2))
scala> arr2.zip(arr1)
res89: Array[(Int, String)] = Array((1,a), (2,b))
scala> arr1 zip arr2
res90: Array[(String, Int)] = Array((a,1), (b,2))
scala> res88.toMap
res91: scala.collection.immutable.Map[String,Int] = Map(a -> 1, b -> 2)

类型转换

Byte Short Int Long Float Double String存在便捷转换方式

但是Any类型上面没有存在任何的转换方式,我们需要强制转换asInstanceOf

scala> val b:Byte = 1
b: Byte = 1

scala> b.toInt
res153: Int = 1

scala> b.toByte
res154: Byte = 1

scala> b.toLong
res155: Long = 1

scala> b.toFloat
res156: Float = 1.0

scala> b.toBoolean
<console>:22: error: value toBoolean is not a member of Byte
       b.toBoolean
         ^
scala> b.toString
res159: String = 1

scala> "123".toInt
res160: Int = 123

scala> val c:Any = 123
c: Any = 123

scala> c.asInstance

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值