优化阅读格式
This commit is contained in:
@ -17,25 +17,25 @@
|
||||
|
||||
## 一、List字面量
|
||||
|
||||
List是Scala中非常重要的一个数据结构,其与Array(数组)非常类似,但是List是不可变的,和Java中的List一样,其底层实现是链表。
|
||||
List 是 Scala 中非常重要的一个数据结构,其与 Array(数组) 非常类似,但是 List 是不可变的,和 Java 中的 List 一样,其底层实现是链表。
|
||||
|
||||
```scala
|
||||
scala> val list = List("hadoop", "spark", "storm")
|
||||
list: List[String] = List(hadoop, spark, storm)
|
||||
|
||||
// List是不可变
|
||||
// List 是不可变
|
||||
scala> list(1) = "hive"
|
||||
<console>:9: error: value update is not a member of List[String]
|
||||
```
|
||||
|
||||
## 二、List类型
|
||||
|
||||
Scala中List具有以下两个特性:
|
||||
Scala 中 List 具有以下两个特性:
|
||||
|
||||
+ **同构(homogeneous)**:同一个List中的所有元素都必须是相同的类型;
|
||||
+ **协变(covariant)**:如果S是T的子类型,那么`List[S]`就是`List[T]`的子类型,例如`List[String]`是`List[Object]`的子类型。
|
||||
+ **同构 (homogeneous)**:同一个 List 中的所有元素都必须是相同的类型;
|
||||
+ **协变 (covariant)**:如果 S 是 T 的子类型,那么 `List[S]` 就是 `List[T]` 的子类型,例如 `List[String]` 是 `List[Object]` 的子类型。
|
||||
|
||||
需要特别说明的是空列表的类型为`List[Nothing]`:
|
||||
需要特别说明的是空列表的类型为 `List[Nothing]`:
|
||||
|
||||
```scala
|
||||
scala> List()
|
||||
@ -44,7 +44,7 @@ res1: List[Nothing] = List()
|
||||
|
||||
## 三、构建List
|
||||
|
||||
所有List都由两个基本单元构成:`Nil` 和`::`(读作"cons")。即列表要么是空列表(Nil),要么是由一个head加上一个tail组成,而tail又是一个List。我们在上面使用的`List("hadoop", "spark", "storm")`最终也是被解释为` "hadoop"::"spark":: "storm"::Nil`。
|
||||
所有 List 都由两个基本单元构成:`Nil` 和 `::`(读作"cons")。即列表要么是空列表 (Nil),要么是由一个 head 加上一个 tail 组成,而 tail 又是一个 List。我们在上面使用的 `List("hadoop", "spark", "storm")` 最终也是被解释为 ` "hadoop"::"spark":: "storm"::Nil`。
|
||||
|
||||
```scala
|
||||
scala> val list01 = "hadoop"::"spark":: "storm"::Nil
|
||||
@ -57,7 +57,7 @@ list02: List[String] = List(hadoop, spark, storm)
|
||||
|
||||
## 四、模式匹配
|
||||
|
||||
Scala支持展开列表以实现模式匹配。
|
||||
Scala 支持展开列表以实现模式匹配。
|
||||
|
||||
```scala
|
||||
scala> val list = List("hadoop", "spark", "storm")
|
||||
@ -92,16 +92,16 @@ object ScalaApp extends App {
|
||||
// 2.返回列表中的第一个元素
|
||||
list.head
|
||||
|
||||
// 3.返回列表中除第一个元素外的所有元素 这里输出List(spark, storm)
|
||||
// 3.返回列表中除第一个元素外的所有元素 这里输出 List(spark, storm)
|
||||
list.tail
|
||||
|
||||
// 4.tail和head可以结合使用
|
||||
// 4.tail 和 head 可以结合使用
|
||||
list.tail.head
|
||||
|
||||
// 5.返回列表中的最后一个元素 与head相反
|
||||
// 5.返回列表中的最后一个元素 与 head 相反
|
||||
list.init
|
||||
|
||||
// 6.返回列表中除了最后一个元素之外的其他元素 与tail相反 这里输出List(hadoop, spark)
|
||||
// 6.返回列表中除了最后一个元素之外的其他元素 与 tail 相反 这里输出 List(hadoop, spark)
|
||||
list.last
|
||||
|
||||
// 7.使用下标访问元素
|
||||
@ -118,7 +118,7 @@ object ScalaApp extends App {
|
||||
|
||||
### 5.2 indices
|
||||
|
||||
indices方法返回所有下标。
|
||||
indices 方法返回所有下标。
|
||||
|
||||
```scala
|
||||
scala> list.indices
|
||||
@ -127,8 +127,8 @@ res2: scala.collection.immutable.Range = Range(0, 1, 2)
|
||||
|
||||
### 5.3 take & drop & splitAt
|
||||
|
||||
- **take**:获取前n个元素;
|
||||
- **drop**:删除前n个元素;
|
||||
- **take**:获取前 n 个元素;
|
||||
- **drop**:删除前 n 个元素;
|
||||
- **splitAt**:从第几个位置开始拆分。
|
||||
|
||||
```scala
|
||||
@ -144,7 +144,7 @@ res5: (List[String], List[String]) = (List(hadoop, spark),List(storm))
|
||||
|
||||
### 5.4 flatten
|
||||
|
||||
flatten接收一个由列表组成的列表,并将其进行扁平化操作,返回单个列表。
|
||||
flatten 接收一个由列表组成的列表,并将其进行扁平化操作,返回单个列表。
|
||||
|
||||
```scala
|
||||
scala> List(List(1, 2), List(3), List(), List(4, 5)).flatten
|
||||
@ -153,7 +153,7 @@ res6: List[Int] = List(1, 2, 3, 4, 5)
|
||||
|
||||
### 5.5 zip & unzip
|
||||
|
||||
对两个List执行`zip`操作结果如下,返回对应位置元素组成的元组的列表,`unzip`则执行反向操作。
|
||||
对两个 List 执行 `zip` 操作结果如下,返回对应位置元素组成的元组的列表,`unzip` 则执行反向操作。
|
||||
|
||||
```scala
|
||||
scala> val list = List("hadoop", "spark", "storm")
|
||||
@ -168,14 +168,14 @@ res7: (List[String], List[Int]) = (List(hadoop, spark, storm),List(10, 20, 30))
|
||||
|
||||
### 5.6 toString & mkString
|
||||
|
||||
toString 返回List的字符串表现形式。
|
||||
toString 返回 List 的字符串表现形式。
|
||||
|
||||
```scala
|
||||
scala> list.toString
|
||||
res8: String = List(hadoop, spark, storm)
|
||||
```
|
||||
|
||||
如果想改变List的字符串表现形式,可以使用mkString。mkString有三个重载方法,方法定义如下:
|
||||
如果想改变 List 的字符串表现形式,可以使用 mkString。mkString 有三个重载方法,方法定义如下:
|
||||
|
||||
```scala
|
||||
// start:前缀 sep:分隔符 end:后缀
|
||||
@ -220,7 +220,7 @@ object ScalaApp extends App {
|
||||
}
|
||||
```
|
||||
|
||||
toArray和toList用于List和数组之间的互相转换。
|
||||
toArray 和 toList 用于 List 和数组之间的互相转换。
|
||||
|
||||
```scala
|
||||
scala> val array = list.toArray
|
||||
@ -230,7 +230,7 @@ scala> array.toList
|
||||
res13: List[String] = List(hadoop, spark, storm)
|
||||
```
|
||||
|
||||
copyToArray将List中的元素拷贝到数组中指定位置。
|
||||
copyToArray 将 List 中的元素拷贝到数组中指定位置。
|
||||
|
||||
```scala
|
||||
object ScalaApp extends App {
|
||||
@ -250,14 +250,14 @@ object ScalaApp extends App {
|
||||
|
||||
### 6.1 列表转换:map & flatMap & foreach
|
||||
|
||||
map 与 Java 8 函数式编程中的map类似,都是对List中每一个元素执行指定操作。
|
||||
map 与 Java 8 函数式编程中的 map 类似,都是对 List 中每一个元素执行指定操作。
|
||||
|
||||
```scala
|
||||
scala> List(1,2,3).map(_+10)
|
||||
res15: List[Int] = List(11, 12, 13)
|
||||
```
|
||||
|
||||
flatMap 与 map 类似,但如果List中的元素还是List,则会对其进行flatten操作。
|
||||
flatMap 与 map 类似,但如果 List 中的元素还是 List,则会对其进行 flatten 操作。
|
||||
|
||||
```scala
|
||||
scala> list.map(_.toList)
|
||||
@ -267,7 +267,7 @@ scala> list.flatMap(_.toList)
|
||||
res17: List[Char] = List(h, a, d, o, o, p, s, p, a, r, k, s, t, o, r, m)
|
||||
```
|
||||
|
||||
foreach 要求右侧的操作是一个返回值为Unit的函数,你也可以简单理解为执行一段没有返回值代码。
|
||||
foreach 要求右侧的操作是一个返回值为 Unit 的函数,你也可以简单理解为执行一段没有返回值代码。
|
||||
|
||||
```scala
|
||||
scala> var sum = 0
|
||||
@ -281,21 +281,21 @@ res19: Int = 15
|
||||
|
||||
### 6.2 列表过滤:filter & partition & find & takeWhile & dropWhile & span
|
||||
|
||||
filter用于筛选满足条件元素,返回新的List。
|
||||
filter 用于筛选满足条件元素,返回新的 List。
|
||||
|
||||
```scala
|
||||
scala> List(1, 2, 3, 4, 5) filter (_ % 2 == 0)
|
||||
res20: List[Int] = List(2, 4)
|
||||
```
|
||||
|
||||
partition会按照筛选条件对元素进行分组,返回类型是tuple(元组)。
|
||||
partition 会按照筛选条件对元素进行分组,返回类型是 tuple(元组)。
|
||||
|
||||
```scala
|
||||
scala> List(1, 2, 3, 4, 5) partition (_ % 2 == 0)
|
||||
res21: (List[Int], List[Int]) = (List(2, 4),List(1, 3, 5))
|
||||
```
|
||||
|
||||
find查找第一个满足条件的值,由于可能并不存在这样的值,所以返回类型是`Option`,可以通过`getOrElse`在不存在满足条件值的情况下返回默认值。
|
||||
find 查找第一个满足条件的值,由于可能并不存在这样的值,所以返回类型是 `Option`,可以通过 `getOrElse` 在不存在满足条件值的情况下返回默认值。
|
||||
|
||||
```scala
|
||||
scala> List(1, 2, 3, 4, 5) find (_ % 2 == 0)
|
||||
@ -305,14 +305,14 @@ val result: Option[Int] = List(1, 2, 3, 4, 5) find (_ % 2 == 0)
|
||||
result.getOrElse(10)
|
||||
```
|
||||
|
||||
takeWhile遍历元素,直到遇到第一个不符合条件的值则结束遍历,返回所有遍历到的值。
|
||||
takeWhile 遍历元素,直到遇到第一个不符合条件的值则结束遍历,返回所有遍历到的值。
|
||||
|
||||
```scala
|
||||
scala> List(1, 2, 3, -4, 5) takeWhile (_ > 0)
|
||||
res23: List[Int] = List(1, 2, 3)
|
||||
```
|
||||
|
||||
dropWhile遍历元素,直到遇到第一个不符合条件的值则结束遍历,返回所有未遍历到的值。
|
||||
dropWhile 遍历元素,直到遇到第一个不符合条件的值则结束遍历,返回所有未遍历到的值。
|
||||
|
||||
```scala
|
||||
// 第一个值就不满足条件,所以返回列表中所有的值
|
||||
@ -324,7 +324,7 @@ scala> List(1, 2, 3, -4, 5) dropWhile (_ < 3)
|
||||
res26: List[Int] = List(3, -4, 5)
|
||||
```
|
||||
|
||||
span遍历元素,直到遇到第一个不符合条件的值则结束遍历,将遍历到的值和未遍历到的值分别放入两个List中返回,返回类型是tuple(元组)。
|
||||
span 遍历元素,直到遇到第一个不符合条件的值则结束遍历,将遍历到的值和未遍历到的值分别放入两个 List 中返回,返回类型是 tuple(元组)。
|
||||
|
||||
```scala
|
||||
scala> List(1, 2, 3, -4, 5) span (_ > 0)
|
||||
@ -335,14 +335,14 @@ res27: (List[Int], List[Int]) = (List(1, 2, 3),List(-4, 5))
|
||||
|
||||
### 6.3 列表检查:forall & exists
|
||||
|
||||
forall检查List中所有元素,如果所有元素都满足条件,则返回true。
|
||||
forall 检查 List 中所有元素,如果所有元素都满足条件,则返回 true。
|
||||
|
||||
```scala
|
||||
scala> List(1, 2, 3, -4, 5) forall ( _ > 0 )
|
||||
res28: Boolean = false
|
||||
```
|
||||
|
||||
exists检查List中的元素,如果某个元素已经满足条件,则返回true。
|
||||
exists 检查 List 中的元素,如果某个元素已经满足条件,则返回 true。
|
||||
|
||||
```scala
|
||||
scala> List(1, 2, 3, -4, 5) exists (_ > 0 )
|
||||
@ -353,7 +353,7 @@ res29: Boolean = true
|
||||
|
||||
### 6.4 列表排序:sortWith
|
||||
|
||||
sortWith对List中所有元素按照指定规则进行排序,由于List是不可变的,所以排序返回一个新的List。
|
||||
sortWith 对 List 中所有元素按照指定规则进行排序,由于 List 是不可变的,所以排序返回一个新的 List。
|
||||
|
||||
```scala
|
||||
scala> List(1, -3, 4, 2, 6) sortWith (_ < _)
|
||||
@ -370,11 +370,11 @@ res33: List[String] = List(azkaban, hadoop, spark, hive)
|
||||
|
||||
## 七、List对象的方法
|
||||
|
||||
上面介绍的所有方法都是List类上的方法,下面介绍的是List伴生对象中的方法。
|
||||
上面介绍的所有方法都是 List 类上的方法,下面介绍的是 List 伴生对象中的方法。
|
||||
|
||||
### 7.1 List.range
|
||||
|
||||
List.range可以产生指定的前闭后开区间内的值组成的List,它有三个可选参数: start(开始值),end(结束值,不包含),step(步长)。
|
||||
List.range 可以产生指定的前闭后开区间内的值组成的 List,它有三个可选参数: start(开始值),end(结束值,不包含),step(步长)。
|
||||
|
||||
```scala
|
||||
scala> List.range(1, 5)
|
||||
@ -389,7 +389,7 @@ res36: List[Int] = List(9, 6, 3)
|
||||
|
||||
### 7.2 List.fill
|
||||
|
||||
List.fill使用指定值填充List。
|
||||
List.fill 使用指定值填充 List。
|
||||
|
||||
```scala
|
||||
scala> List.fill(3)("hello")
|
||||
@ -401,7 +401,7 @@ res38: List[List[String]] = List(List(world, world, world), List(world, world, w
|
||||
|
||||
### 7.3 List.concat
|
||||
|
||||
List.concat用于拼接多个List。
|
||||
List.concat 用于拼接多个 List。
|
||||
|
||||
```scala
|
||||
scala> List.concat(List('a', 'b'), List('c'))
|
||||
@ -418,18 +418,18 @@ res41: List[Nothing] = List()
|
||||
|
||||
## 八、处理多个List
|
||||
|
||||
当多个List被放入同一个tuple中时候,可以通过zipped对多个List进行关联处理。
|
||||
当多个 List 被放入同一个 tuple 中时候,可以通过 zipped 对多个 List 进行关联处理。
|
||||
|
||||
```scala
|
||||
// 两个List对应位置的元素相乘
|
||||
// 两个 List 对应位置的元素相乘
|
||||
scala> (List(10, 20), List(3, 4, 5)).zipped.map(_ * _)
|
||||
res42: List[Int] = List(30, 80)
|
||||
|
||||
// 三个List的操作也是一样的
|
||||
// 三个 List 的操作也是一样的
|
||||
scala> (List(10, 20), List(3, 4, 5), List(100, 200)).zipped.map(_ * _ + _)
|
||||
res43: List[Int] = List(130, 280)
|
||||
|
||||
// 判断第一个List中元素的长度与第二个List中元素的值是否相等
|
||||
// 判断第一个 List 中元素的长度与第二个 List 中元素的值是否相等
|
||||
scala> (List("abc", "de"), List(3, 2)).zipped.forall(_.length == _)
|
||||
res44: Boolean = true
|
||||
```
|
||||
@ -438,7 +438,7 @@ res44: Boolean = true
|
||||
|
||||
## 九、缓冲列表ListBuffer
|
||||
|
||||
上面介绍的List,由于其底层实现是链表,这意味着能快速访问List头部元素,但对尾部元素的访问则比较低效,这时候可以采用`ListBuffer`,ListBuffer提供了在常量时间内往头部和尾部追加元素。
|
||||
上面介绍的 List,由于其底层实现是链表,这意味着能快速访问 List 头部元素,但对尾部元素的访问则比较低效,这时候可以采用 `ListBuffer`,ListBuffer 提供了在常量时间内往头部和尾部追加元素。
|
||||
|
||||
```scala
|
||||
import scala.collection.mutable.ListBuffer
|
||||
@ -451,7 +451,7 @@ object ScalaApp extends App {
|
||||
buffer += 2
|
||||
// 2.在头部追加元素
|
||||
3 +=: buffer
|
||||
// 3. ListBuffer转List
|
||||
// 3. ListBuffer 转 List
|
||||
val list: List[Int] = buffer.toList
|
||||
println(list)
|
||||
}
|
||||
@ -463,14 +463,14 @@ object ScalaApp extends App {
|
||||
|
||||
## 十、集(Set)
|
||||
|
||||
Set是不重复元素的集合。分为可变Set和不可变Set。
|
||||
Set 是不重复元素的集合。分为可变 Set 和不可变 Set。
|
||||
|
||||
### 10.1 可变Set
|
||||
|
||||
```scala
|
||||
object ScalaApp extends App {
|
||||
|
||||
// 可变Set
|
||||
// 可变 Set
|
||||
val mutableSet = new collection.mutable.HashSet[Int]
|
||||
|
||||
// 1.添加元素
|
||||
@ -483,13 +483,13 @@ object ScalaApp extends App {
|
||||
// 2.移除元素
|
||||
mutableSet.remove(2)
|
||||
|
||||
// 3.调用mkString方法 输出1,3,4
|
||||
// 3.调用 mkString 方法 输出 1,3,4
|
||||
println(mutableSet.mkString(","))
|
||||
|
||||
// 4. 获取Set中最小元素
|
||||
// 4. 获取 Set 中最小元素
|
||||
println(mutableSet.min)
|
||||
|
||||
// 5. 获取Set中最大元素
|
||||
// 5. 获取 Set 中最大元素
|
||||
println(mutableSet.max)
|
||||
|
||||
}
|
||||
@ -497,12 +497,12 @@ object ScalaApp extends App {
|
||||
|
||||
### 10.2 不可变Set
|
||||
|
||||
不可变Set没有add方法,可以使用`+`添加元素,但是此时会返回一个新的不可变Set,原来的Set不变。
|
||||
不可变 Set 没有 add 方法,可以使用 `+` 添加元素,但是此时会返回一个新的不可变 Set,原来的 Set 不变。
|
||||
|
||||
```scala
|
||||
object ScalaApp extends App {
|
||||
|
||||
// 不可变Set
|
||||
// 不可变 Set
|
||||
val immutableSet = new collection.immutable.HashSet[Int]
|
||||
|
||||
val ints: HashSet[Int] = immutableSet+1
|
||||
@ -516,19 +516,19 @@ object ScalaApp extends App {
|
||||
|
||||
### 10.3 Set间操作
|
||||
|
||||
多个Set之间可以进行求交集或者合集等操作。
|
||||
多个 Set 之间可以进行求交集或者合集等操作。
|
||||
|
||||
```scala
|
||||
object ScalaApp extends App {
|
||||
|
||||
// 声明有序Set
|
||||
// 声明有序 Set
|
||||
val mutableSet = collection.mutable.SortedSet(1, 2, 3, 4, 5)
|
||||
val immutableSet = collection.immutable.SortedSet(3, 4, 5, 6, 7)
|
||||
|
||||
// 两个Set的合集 输出:TreeSet(1, 2, 3, 4, 5, 6, 7)
|
||||
// 两个 Set 的合集 输出:TreeSet(1, 2, 3, 4, 5, 6, 7)
|
||||
println(mutableSet ++ immutableSet)
|
||||
|
||||
// 两个Set的交集 输出:TreeSet(3, 4, 5)
|
||||
// 两个 Set 的交集 输出:TreeSet(3, 4, 5)
|
||||
println(mutableSet intersect immutableSet)
|
||||
|
||||
}
|
||||
@ -538,5 +538,5 @@ object ScalaApp extends App {
|
||||
|
||||
## 参考资料
|
||||
|
||||
1. Martin Odersky . Scala编程(第3版)[M] . 电子工业出版社 . 2018-1-1
|
||||
2. 凯.S.霍斯特曼 . 快学Scala(第2版)[M] . 电子工业出版社 . 2017-7
|
||||
1. Martin Odersky . Scala 编程 (第 3 版)[M] . 电子工业出版社 . 2018-1-1
|
||||
2. 凯.S.霍斯特曼 . 快学 Scala(第 2 版)[M] . 电子工业出版社 . 2017-7
|
||||
|
Reference in New Issue
Block a user