scala 之 集合

版权声明: https://blog.csdn.net/weixin_39966065/article/details/89854820

目录

 

1、Scala的集合体系结构

2.Range 

3.List

4.LinkedList

5.Set

6.集合的函数式编程

7.函数式编程综合案例:统计多个文本内的单词总数

8.扩展问题


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中这种方式的实现 
自我理解:表示直接操作调用对象的属性
为何不使用 () 进行包裹,因为它的计算顺序就是默认的从左至右,符合我们的逻辑

猜你喜欢

转载自blog.csdn.net/weixin_39966065/article/details/89854820
今日推荐