1. Scala的集合体系结构

Scala中的集合体系主要包括(结构跟Java相似):

  • Iterable(所有集合trait的根trait)
  • Seq(Range、ArrayBuffer、List等)
  • Set(HashSet、LinkedHashSet、SortedSet等)
  • Map (HashMap、SortedMap、LinkedHashMap等)

Scala中的集合分为可变和不可变两类集合,分别对应scala.collection.mutable和scala.collection.immutable两个包。

2. List

List代表一个不可变的列表。

  • List有head和tail,head代表List的第一个元素,tail代表第一个元素之后的所有元素。

scala> val list = List(1, 2, 3, 4)
list: List[Int] = List(1, 2, 3, 4)
scala> list.head
res33: Int = 1
scala> list.tail
res34: List[Int] = List(2, 3, 4)

  
案例:用递归函数给List中每个元素都加上指定的前缀并打印


// 如果List只有一个元素,那么他的tail就是Nil
def decorator(list: List[Int], prefix: String){
if (list != Nil) {
println(prefix + list.head)
decorator(list.tail, prefix)
}
}
scala> decorator(list, "+")
+1
+2
+3
+4

  • List有特殊的::操作符,可以用于将head和tail合并成一个List。

scala> list
res37: List[Int] = List(1, 2, 3, 4)
scala> 0::list
res38: List[Int] = List(0, 1, 2, 3, 4)

该操作符在Spark源码中有体现

3. LinkedList

LinkedList代表一个可变的列表,其elem和next属性类似于List的head和tail。

案例:使用while循环将LinkedList中每个一个元素乘以二。


val list = scala.collection.mutable.LinkedList(1,2,3,4,5,6,7,8,9)
var currentList = list
var first = true
while( currentList !=Nil && currentList.next != Nil){
if(first) { currentList.elem *= 2; first = false}
currentList = currentList.next.next
if(currentList != Nil) currentList.elem *= 2
}
list: scala.collection.mutable.LinkedList[Int] = LinkedList(2, 2, 6, 4, 10, 6, 14, 8, 18)

4. Set

Set代表一个没有重复元素的集合

HashSet

不保证插入顺序,元素是乱序的


scala> val s = new scala.collection.mutable.HashSet[Int]()
s: scala.collection.mutable.HashSet[Int] = Set()
scala> s += 1
res40: s.type = Set(1)
scala> s += 2
res41: s.type = Set(1, 2)
scala> s += 5
res42: s.type = Set(1, 5, 2)

LinkedHashSet

保证插入顺序,底层使用链表


scala> val s = new scala.collection.mutable.LinkedHashSet[Int]()
s: scala.collection.mutable.LinkedHashSet[Int] = Set()
scala> s += 1
res43: s.type = Set(1)
scala> s += 2
res44: s.type = Set(1, 2)
scala> s += 5
res45: s.type = Set(1, 2, 5)

SortedSet

会自动根据key来进行排序(默认字母顺序)


scala> val s = scala.collection.mutable.SortedSet("orange", "apple", "banana")
s: scala.collection.mutable.SortedSet[String] = TreeSet(apple, banana, orange)

5. 集合的函数式编程(重要!)

Scala中集合的函数式编程最大的体现就是对于一系列高阶函数的使用。

高阶函数的使用是Scala与Java最大的区别!因为Java中没有函数式编程,也肯定没有高阶函数,无法直接将函数传入一个方法,或者让一个方法返回一个函数。


// 为List中的每个元素都添加一个前缀
scala> List("leo", "spark","peter").map("name is " + _)
res47: List[String] = List(name is leo, name is spark, name is peter)
// 拆分单词
scala> List("Hello world", "your are my friend").flatMap(_.split(" "))
res48: List[String] = List(Hello, world, your, are, my, friend)
// 打印每一个元素
scala> List("Hello world", "your are my friend").foreach(println(_))
Hello world
your are my friend
// 学生姓名和成绩进行关联
scala> List("leo", "jen", "jack").zip(List(100, 30, 20))
res50: List[(String, Int)] = List((leo,100), (jen,30), (jack,20))

6. 综合案例:统计多个文本内的单词总数


// 使用scala的IO包将文件文件内的数据读取出来
scala> val lines1 = scala.io.Source.fromFile("E://test.txt").mkString
lines1: String = hello my
scala> val lines2 = scala.io.Source.fromFile("E://test2.txt").mkString
lines2: String = you are a good boy
// 使用List的伴生对象,将多个文件内的内容创建为一个List
scala> val lines = List(lines1, lines2)
lines: List[String] = List(hello my, you are a good boy)
// 首先将所有元素以空格分割单词,接着将每个单词映射为(单词,1)元组, 然后再取出元组里的第二个元素(_._2表示取出元组中的第二个元素),最后做累加
scala> lines.flatMap(_.split(" ")).map((_, 1)).map(_._2).reduceLeft(_ + _)
res51: Int = 7

注意:最后一行多个高阶函数的链式调用其实就是Scala函数式编程的精髓所在,也是Scala相较于Java等编程语言最大的功能优势所在。并且Spark的源码中大量使用了这种复杂的链式调用,Spark本身提供的开发API也完全沿用了Scala的函数式编程。

Scala入门系列(十):函数式编程之集合操作的更多相关文章

  1. Scala学习教程笔记三之函数式编程、集合操作、模式匹配、类型参数、隐式转换、Actor、

    1:Scala和Java的对比: 1.1:Scala中的函数是Java中完全没有的概念.因为Java是完全面向对象的编程语言,没有任何面向过程编程语言的特性,因此Java中的一等公民是类和对象,而且只 ...

  2. Scala编程入门---函数式编程之集合操作

    集合的函数式编程: 实战常用: //map案例实战:为List中的每个元素都添加一个前缀. List("leo","Jen","peter" ...

  3. scala 函数式编程之集合操作

    Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的集合体系非常相似. ...

  4. Scala - 快速学习09 - 函数式编程:一些操作

    1- 集合类(collection) 系统地区分了可变的和不可变的集合. scala.collection包中所有的集合类 可变集合(Mutable) 顾名思义,意味着可以修改,移除或者添加一个元素. ...

  5. 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词

    package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...

  6. Scala入门系列(九):函数式编程

    引言 Scala是一门既面向对象,又面向过程的语言,Scala的函数式编程,就是Scala面向过程最好的佐证.也真是因此让Scala具备了Java所不具备的更强大的功能和特性. 而之所以Scala一直 ...

  7. Scala - 快速学习08 - 函数式编程:高阶函数

    函数式编程的崛起 函数式编程中的“值不可变性”避免了对公共的可变状态进行同步访问控制的复杂问题,能够较好满足分布式并行编程的需求,适应大数据时代的到来. 函数是第一等公民 可以作为实参传递给另外一个函 ...

  8. Scala入门系列(三):数组

    Array 与Java的Array类似,也是长度不可变的数组,此外,由于Scala与Java都是运行在JVM中,双方可以互相调用,因此Scala数组的底层实际上是Java数组. 注意:访问数组中元素使 ...

  9. Python(十) 函数式编程: 匿名函数、高阶函数、装饰器

    一.lambda表达式 lambda parameter_list: expression # 匿名函数 def add(x,y): return x+y print(add(1,2)) f = la ...

随机推荐

  1. 使用angular4和asp.net core 2 web api做个练习项目(三)

    第一部分: http://www.cnblogs.com/cgzl/p/7755801.html 第二部分: http://www.cnblogs.com/cgzl/p/7763397.html 后台 ...

  2. D - MUH and Cube Walls

    D. MUH and Cube Walls   Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elephant ...

  3. VMware三种网络模式

    VMware网络配置详解一:三种网络模式简介安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口,这些后 ...

  4. 行内脚本的位置放置----css阻塞行内脚本

    行内脚本:避免放置在css和其他资源之间. 若在head中,最好放在css样式表之前,如果放置在样式表之后,会引起css阻塞. css阻塞:由于浏览器要保证css和JavaScript的执行顺序,cs ...

  5. DataFrame使用总结1(超实用)

    DataFrame使用总结1(超实用): 1. 合并两个表 frame = [df1, df2] df = pd.concat(frame) res = pd.merge(df, df1, on=[' ...

  6. AJAX 笔记

    一.什么是 AJAX ? AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页的技术. 通过 ...

  7. PHPMailer < 5.2.18 远程代码执行漏洞(CVE-2016-10033)

    PHPMailer < 5.2.18 Remote Code Execution 本文将简单展示一下PHPMailer远程代码执行漏洞(CVE-2016-10033)的利用过程,使用的是别人已经 ...

  8. 【ThinkPHP框架学习 】(2) --- 后台管理系统如何用iframe点击左边右边局部刷新

    如题:         在写后台管理系统时,需要实现后台界面的局部动态刷新.         左边的导航栏使用a标签进行设置,通过href和target属性的配合,就可以将iframe中的子页实现动态 ...

  9. 全球领先的redis客户端:SFedis

    零.背景 这个客户端起源于我们一个系统的生产问题. 一.问题的发生 在我们的生产环境上发生了两次redis服务端连接数达到上限(我们配置的单节点连接数上限为8000)导致无法创建连接的情况.由于这个系 ...

  10. HTML知识速递

    1.html的定义 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器按顺序渲染网页文件,然后 ...