目录
1、Scala的集合体系结构
整体:Iterable、Seq、Set、Map
结构划分: Iterable是所有集合trait的根trai
Seq下包含了Range、ArrayBuffer、List等子trait
2.Range
scala中数据类型隐式转化的特性
1 to 10、 1 until 10 形成 Range 集合的过程:
(1) RichInt 1 Int implicit conversion
(2)RichInt(1).to(RichInt(10))
RichInt(1).until(RichInt(10))
3.List
(1)特点:不可变列表
(2)主要属性:head,tail
(3)特殊操作符号:“双冒号”
val list = List(1, 2, 3, 4)
val listNew = 0::list
// List(0,1,2,3,4)
(4)List中的Nil:
如果一个Lis要t只有一个元素,那么它的head就是这个元素,它的tail是Nil
(5)案例:给List都加上指定前缀
思路:函数递归
4.LinkedList
(1)特点:可变的列表
(2)主要属性:elem,next
val l = scala.collection.mutable.LinkedList(1, 2, 3, 4, 5);
l.elem //1:Int
l.next //LinkedList(2,3,4,5)
(3)案例1:每个元素都乘以2
val list = scala.collection.mutable.LinkedList(1, 2, 3, 4, 5)
var currentList = list
while (currentList != Nil) {
currentList.elem = currentList.elem * 2
currentList = currentList.next
}
(4)案例2:
val list = scala.collection.mutable.LinkedList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
var currentList = list
var first = true
while (currentList != Nil && currentList.next != Nil) {
if (first) { currentList.elem = currentList.elem * 2; first = false }
currentList = currentList.next.next
if (currentList != Nil) currentList.elem = currentList.elem * 2
}
弄清楚:list.next.next 就是 (list.next).next
(5)与Java 的区别:
在var 和 val 中使用 “=”时:
并不只是指向同一个内存地址
5.Set
(1)特点:不重复
不保证顺序
Set 不可变列表
HashSet 可变列表
SortedSet 自动依据Key进行排序
(2)事例
val s = Set(1, 2, 3); s + 1; s + 4
val s = scala.collection.mutable.HashSet[Int](); s += 1; s += 2; s += 5
val s = scala.collection.mutable.LinkedHashSet[Int](); i += 1; s += 2; s += 5
val s = scala.collection.mutable.SortedSet("orange", "apple", "banana")
6.集合的函数式编程
特点:高阶函数的使用,也是Scala与Java最大的一点不同
Scala最有诱惑力、最有优势的一个功能
// map案例实战:为List中每个元素都添加一个前缀
List("Leo", "Jen", "Peter", "Jack").map("name is " + _)
// faltMap案例实战:将List中的多行句子拆分成单词
List("Hello World", "You Me").flatMap(_.split(" "))
// foreach案例实战:打印List中的每个单词 ??? 待续
//着重理解,为何不支持 B 情况
List("I","hava","a","beautiful","girl").foreach(print(_))
List("I","hava","a","beautiful","girl").foreach(print(_+" "))
error:
<console>:8: error: missing parameter type for expanded function ((x$1) => x$1.$plus(" "))
List("I","hava","a","beautiful","girl").foreach(print(_ +" "))
// zip案例实战:对学生姓名和学生成绩进行关联
List("Leo", "Jen", "Peter", "Jack").zip(List(100, 90, 75, 83))
7.函数式编程综合案例:统计多个文本内的单词总数
val lines01 = scala.io.Source.fromFile("E://spark//spark.txt").mkString
val lines02 = scala.io.Source.fromFile("E://spark//top.txt").mkString
val lines = List(lines01, lines02)
lines.flatMap(_.split(" ")).map((_, 1)).map(_._2).reduceLeft(_ + _)
感悟:对面向函数式编程的理解(写法的优美,高效)
就是面向过程的,只需要得到一个结果而已
8.扩展问题
(1) 数据结构扩展
作用表现:
链表 《————》 顺序
去重 《————》
如何实现这些作用?
(2)链式函数调用方式 ?? ***** 《——————》 反观Java中这种方式的实现
自我理解:表示直接操作调用对象的属性
为何不使用 () 进行包裹,因为它的计算顺序就是默认的从左至右,符合我们的逻辑