集合简介
1)说明
(1)Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质。
(2)对于几乎所有的集合类,Scala都同时提供了可变和不可变的版本,分别位于以下两个包
不可变集合:scala.collection.immutable
可变集合: scala.collection.mutable
2)案例实操
(1)Scala不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而不会对原对象进行修改。
(2)可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。
object TestList {
def main(args: Array[String]): Unit = {
//不可变List
val immutableList: List[Int] = List(1, 2, 3, 4, 5)
//对不可变List进行修改,在头部添加一个元素0
val newImmutableList: List[Int] = 0 +: immutableList
println(immutableList)
println(newImmutableList)
//可变List
val mutableList: ListBuffer[Int] = ListBuffer(1, 2, 3, 4, 5)
//对可变List进行修改,在头部添加一个元素0
val newMutableList: ListBuffer[Int] = 0 +=: mutableList
println(mutableList)
println(newMutableList)
}
}
不可变集合继承图
1)Set、Map是Java中也有的集合
2)Seq是Java没有的,我们发现List归属到Seq了,因此这里的List就和Java不是同一个概念了
3)我们前面的for循环有一个 1 to 3,就是IndexedSeq下的Vector
4)String也是属于IndexeSeq
5)我们发现经典的数据结构比如Queue和Stack被归属到LinerSeq
6)大家注意Scala中的Map体系有一个SortedMap,说明Scala的Map可以支持排序
7)IndexSeq和LinearSeq的区别:
(1)IndexSeq是通过索引来查找和定位,因此速度快,比如String就是一个索引集合,通过索引即可定位
(2)LineaSeq是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找
可变集合继承图
集合符号总结:
带+与带-的区别:
带+是添加元素
带-是删除元素(不可变一般没有-号)一个+/-与两个+/-的区别:
一个+/-是添加/删除单个元素
两个+/-是添加/删除指定集合所有元素冒号在前与冒号在后以及不带冒号的区别:
冒号在前是将元素添加在集合最末尾
不带冒号是将元素添加在集合最末尾
冒号在后是将元素添加在集合最前面带=与不带=的区别
带=是修改集合本身(不可变一般没有=号)
不带=是生成一个新集合,原集合没有改变有序集合:【数组、list、队列】
update/updated方法修改元素
可变的不需要update/updated方法,直接通过角标修改数据
不可变的需要update/updated方法才能修改数据
update:修改集合本身
updated:生成一个新的集合,原集合没有改变-
无序集合:【map、set】
set
-
map
不可变map,不可删除元素
- 可变map,可删除
集合分类
数组
不可变数组
_ 不可变数组创建:
1、通过new创建: new Array元素类型
2、通过apply方法: Array元素类型
添加数据
删除数据
获取数据: 数组名(角标)
修改数据: 数组名(角标) = 值
package tcode.chapter07
object $01_ImmutableArray {
def main(args: Array[String]): Unit = {
//1、通过new创建: new Array[元素类型](数组的长度)
val arr = new Array[String](10)
println(arr.toList)
//2、通过apply方法: Array[元素类型](初始元素,...)
val arr2 = Array[Int](10,3,7,9,20)
println(arr2.toList)
//3、添加元素
//添加单个元素
val arr3 = arr2.+:(40)
println(arr3.toList)
println(arr2.toList)
println( arr2.eq(arr3) )
val arr4 = arr2.:+(50)
println(arr4.toList)
//添加一个整个集合
val arr5 = arr2.++(Array(100,200,300))
println(arr5.toList)
val arr6 = arr2.++:(Array(600,700,800))
println(arr6.toList)
//2、删除
//3、获取元素
println(arr2(0))
//4、修改元素
arr2(0) = 100
println(arr2.toList)
arr2.update(1,30) // 只改变原集合,不会生成新集合
println(arr2.toList)
//不可变转可变
val arr10 = arr2.toBuffer
println(arr10)
}
}
可变数组
可变数组的创建:
1、通过new: new ArrayBuffer元素类型
2、通过apply方法: ArrayBuffer元素类型
package tcode.chapter07
import scala.collection.mutable.ArrayBuffer
object $02_MutbaleArray {
def main(args: Array[String]): Unit = {
//1、通过new: new ArrayBuffer[元素类型]()
val arr = new ArrayBuffer[Int]()
//2、通过apply方法: ArrayBuffer[元素类型](初始元素,...)
val arr2 = ArrayBuffer[Int](10,4,5,2,9)
println(arr.toList)
println(arr2.toList)
//添加元素
val arr3 = arr2.+:(10)
println(arr3.toList)
println(arr2.toList)
val arr4 = arr2.:+(30)
println(arr4.toList)
arr2.+=(60)
println(arr2.toList)
arr2.+=:(90)
println(arr2.toList)
//添加一个集合
val arr5 = arr2.++( Array(100,200) )
println(arr5.toList)
val arr6 = arr2.++:( Array(100,200) )
println(arr6.toList)
arr2.++=( Array(500,600) )
println(arr2.toList)
arr2.++=:( Array(500,600) )
println(arr2.toList)
//删除
val arr7 = arr2.-( 500 )
println(arr7.toList)
arr2.-=( 600 )
println(arr2.toList)
val arr8 = arr2.-- ( Array(500,600,600))
println(arr8.toList)
arr2.--=( Array(500,600,2,9) )
println(arr2.toList)
arr2.remove(0,3)
//获取元素
println(arr2(0))
//修改元素
arr2(0)=900
println(arr2.toList)
arr2.+=(500)
arr2.+=(500)
arr2.+=(600)
println(arr2.toList)
//可变转不可变
val arr10 = arr2.toArray
println(arr10.toList)
//多维数组的创建
val arr11 = Array.ofDim[Int](3,4)
println(arr11.length)
println(arr11(0).length)
}
}
Seq集合(List)
不可变list
创建:<br /> 1、apply方法: List[元素类型](初始元素,。。。)<br /> 2、初始元素 :: 初始元素 :: ... :: 不可变List/Nil(空的不可变list)<br />添加位置:看元素处于::的位置<br /> :: 最右边必须是不可变List或者是Nil<br /> Nil是空集合,Nil与List的关系类似Null与String的关系<br /> ** Nil一般可以用于给不可变List变量赋予初始值, Nil给不可变List变量赋予初始值的时候**必须指定变量类型<br /> <br /> :: 与 ::: 的区别:<br /> ::是添加单个元素<br /> ::: 是添加一整个集合(array、list等)所有元素
list转array
println(list10.toBuffer)
package tcode.chapter07
object $03_ImmutableList {
def main(args: Array[String]): Unit = {
//1、apply方法: List[元素类型](初始元素,。。。)
val list = List[Int](10,3,6,7,2)
var list2:List[Int] = Nil
list2= list
//2、初始元素 :: 初始元素 :: ... :: List/Nil
val list3 = 10 :: 5 :: 6 :: Nil
println(list3)
//3、添加元素
val list4 = list3.+:(20)
println(list4)
val list5 = list3.:+(40)
println(list5)
val list6 = 40 :: list3
println(list6)
val list7 = list3.++(Array(10,20,30))
println(list7)
val list8 = list3.++:(Array(10,2030))
println(list8)
val list9 = List(50,60,70) ::: list3
println(list9)
val list10 = List(50,60,70) :: list3
println(list10) // 两个冒号的结果是List(List(10,20,30),10,5,6)
//删除:无
//获取元素
println(list9(0))
//修改元素
//list9(0)=100,没办法通过这种方式获取值
//println(list9)
val list10 = list9.updated(0,100)// 获取给新list,0:索引,100:值
println(list9)
println(list10)
//List转Array
println(list10.toBuffer)
}
}
可变list
package tcode.chapter07
import scala.collection.mutable.ListBuffer
object $04_MutableList {
/**
* 创建可变List: ListBuffer[元素类型](初始元素,...)
*/
def main(args: Array[String]): Unit = {
val list = ListBuffer[Int](10,20,3,5,9)
println(list)
//添加元素
val list2 = list.+:(30)
println(list2)
val list3 = list.:+(50)
println(list3)
list.+=(100)
println(list)
list.+=:(300)
println(list)
val list4 = list.++(Array(100,200,300))
println(list4)
val list5 = list.++:(Array(100,200,300))
println(list5)
list.++=(List(11,22,33))
println(list)
list.++=:(List(44,55,66))
println(list)
//删除元素
val list6 = list.-( 55 )
println(list6)
list.-=(66)
println(list)
val list7 = list.--(List(44,300,11))
println(list7)
list.--=(List(10,20,22,33))
println(list)
//获取元素
println(list(0))
//修改元素
list(0)=100
println(list)
//可变转不可变
println(list.toList)
}
}
set集合
不可变set
package tcode.chapter07
object $05_ImmutableSet {
//Set的特性: 无序,不重复
//
def main(args: Array[String]): Unit = {
//创建Set: Set[元素类型](初始元素,...)
val set = Set[Int](10,2,2,5,1,9)
println(set)
//添加元素
val set2 = set.+(20)
println(set2)
val set3 = set.++(List(100,94,20,99))
println(set3)
val set4 = set.++:(List(100,94,20,99))
println(set4)
//删除元素
val set5 = set.-(10)
println(set5)
val set6 = set.--(List(5,1,9))
println(set6)
//获取元素,只能通过遍历获得
// println(set6(10)) // 返回true/false
for(e<- set){
println(e)
}
//修改元素,无法修改
}
}
可变set
package tcode.chapter07
import scala.collection.mutable
object $06_MutableSet {
def main(args: Array[String]): Unit = {
//创建: mutable.Set[元素类型](初始元素,。。。。)
val set = mutable.Set[Int](10,3,7,2,9,20)
println(set)
//添加
val set2 = set.+(100)
println(set2)
set.+=(100)
println(set)
val set3 = set.++(List(200,87,65))
println(set3)
val set4 = set.++:(List(200,87,65))
println(set4)
set.++=(List(200,87,65))
println(set)
//删除
val set5 = set.-(2)
println(set5)
set.-=(100)
println(set)
val set6 = set.--(List(2,3,7))
println(set6)
set.--=(List(2,3,7))
println(set)
//修改元素
//set.update(200,false),这个update执行的是新增操作,无法修改元素,true则添加元素
//println(set)
}
}
元祖:
/*
元组创建:
1、通过()方式创建: (初始元素,…)
2、通过->方式创建[只能在二元元组使用]: K->V
scala中二元元祖对应KV键值对
元组中最多只能存放22个元素
元组一旦定义就不可变[元素不可变,长度不可变]
元组获取值: 元组名._角标 [元组的角标从1开始] 如 : r._1
*/
package tcode.chapter07
object $07_Tuple {
def main(args: Array[String]): Unit = {
//元组创建:
val t1 = ("zhangsan",20,"shenzhen")
val t2 = "zhagnsan"->20
println(t1)
println(t2)
println(t1._1)
val logs = List("1 zhangsan 20 shenzhen","2 wagnwu 30 beijing","3 zhaoliu 44 shenzhen")
val persons = for(e<- logs) yield {
val arr = e.split(" ")
(arr(0),arr(1),arr(2).toInt,arr(3))
}
// persons: list((1,zhangsan,20,shenzhen),(。。。),(。。。))
for(e<- persons){
println(e._3)
}
val list2 = List[Region](
new Region("宝安区",new School("宝安中学",new Clazz("大数据班",new Student("zhangsan",20)))),
new Region("宝安区",new School("宝安中学",new Clazz("大数据班",new Student("wangwu",20)))),
new Region("宝安区",new School("宝安中学",new Clazz("大数据班",new Student("zhaoliu",20))))
)
val ts = List[(String,(String,(String,(String,Int))))](
("宝安区",("宝安中学",("大数据班",("zhangsan",20)))),
("宝安区",("宝安中学",("大数据班",("wangwu",20)))),
("宝安区",("宝安中学",("大数据班",("zhaoliu",20))))
)
for(element<- ts){
println( element._2._2._2._1 )
}
}
class Region(name:String,school:School)
class School(name:String,clazz:Clazz)
class Clazz(name:String,stu:Student)
class Student(name:String,age:Int)
}
map集合
不可变map
* 创建方式:<br /> * Map[K的类型,V的类型]( (K,V) ,..)<br /> * Map[K的类型,V的类型]( K->V ,..)<br /> * Option: 提醒外部当前返回结果有可能为空(防止空指针异常),需要进行处理<br /> * Some: 代表有值,值封装在Some中<br /> * None: 代表为空<br /> * Map取值通过getOrElse(key,默认值)[代表key如果在map中存在则取出对应的value值,如果不存在则返回默认值]
package tcode.chapter07
object $08_ImmutableMap {
/**
* 创建方式:
* Map[K的类型,V的类型]( (K,V) ,..)
* Map[K的类型,V的类型]( K->V ,..)
* Option: 提醒外部当前返回结果有可能为空,需要进行处理
* Some: 代表有值,值封装在Some中
* None: 代表为空
* Map取值通过getOrElse(key,默认值)[代表key如果在map中存在则取出对应的value值,如果不存在则返回默认值]
*
*/
def main(args: Array[String]): Unit = {
val map = Map[String,Int]("aa"->1,"bb"->2,("cc",3) )
//添加元素
val map2 = map.+( "dd"->4 )
println(map2)
val map3 = map.++( List( ("ee",10),"oo"->20,"tt"->30,"ff"->20 ) )
println(map3)
val map4 = map.++:( List( ("ee",10),"oo"->20,"tt"->30,"ff"->20 ) )
println(map4)
//获取元素
// map4.get("ee").get,可以通过get方法获取,但是返回类型是option类型,需要再通过get从some中获得,但是没什么意义
println(map4.getOrElse("ee",0))
//修改元素
//map4("ee")=200 ,不可变map无法通过这种方式修改
// updated方法:如果存在key则修改元素,如果不存在Key则不修改元素
val map5 = map4.updated("ee",100)
println(map4)
// println(map5)
// 删除元素:无
}
}
可变map
package tcode.chapter07
import scala.collection.mutable
object $09_MutableMap {
def main(args: Array[String]): Unit = {
val map = mutable.Map[String,Int]("aa"->10,("bb",20),"tt"->50)
//添加元素
val map2 = map.+( "pp"->60 )
println(map2)
map.+=( "uu"->33 )
println(map)
val map4 = map.++( List( "rr"->10,"ll"->20 ))
println(map4)
val map5 = map.++:(List( "rr"->10,"ll"->20 ))
println(map5)
map.++=(List( "rr"->10,"ll"->20 ))
println(map)
map.put("zz",300)
println(map)
//删除,只需要删除key即可
val map6 = map.-("uu")
println(map6)
map.-=("uu")
println(map)
val map7 = map.--(List("ll","aa","rr"))
println(map7)
map.--=(List("ll","aa","rr"))
println(map)
map.remove("zz")
println(map)
//获取元素
println(map.getOrElse("bb", 200))
//修改元素
map("bb")=200
println(map)
map.update("bb",400)
println(map)
}
}
队列
可变队列
package tcode.chapter07
import scala.collection.immutable.Queue
object $10_ImmutableQueue {
def main(args: Array[String]): Unit = {
//创建: Queue[元素类型](初始元素,...)
val q1 = Queue[Int](1,5,7,9,2)
println(q1)
//添加元素
val q2 = q1.+:( 20 )
println(q2)
val q3 = q1.:+( 30 )
println(q3)
val q4 = q1.++(List(100,400,200))
println(q4)
val a5 = q1.++:(List(100,400,200))
println(a5)
val q6 = q1.enqueue(1000)
println(q6)
//删除,dequeue返回值为元祖(A, Queue[A])A为出列的元素,Queue[A]为剩余元素
val r = q1.dequeue
println(r._1)
println(r._2)
//获取元素
println(q1(0))
//修改元素
//q1(0)=100 // 不可变无法通过下标修改
//println(q1)
val q9 = q1.updated(0,100)
println(q9)
}
}
不可变队列
package tcode.chapter07
import scala.collection.mutable
object $11_MutableQueue {
def main(args: Array[String]): Unit = {
//创建
val queue = mutable.Queue[Int](10,2,5,8,20)
//添加元素
val queue2 = queue.+:( 30 )
println(queue2)
val queue3 = queue.:+(40)
println(queue3)
queue.+=(50)
queue.+=:(70)
println(queue)
val queue4 = queue.++(List(100,300,200))
val queue5 = queue.++:(List(100,300,200))
queue.++=(List(100,300,200))
println(queue4)
println(queue5)
println(queue)
queue.enqueue(55,44,333)
println(queue)
//删除,dequeue返回值类型:元祖
println(queue.dequeue())
//获取元素
println(queue(0))
//修改元素
queue(1)=222
println(queue)
queue.update(0,111)
println(queue)
}
}
par并行集合
/*
并行集合: scala集合默认是单线程操作,如果想要多线程操作集合元素,需要使用并行集合
普通集合转并行集合: 集合名.par
/
package tcode.chapter07
object $12_Par {
def main(args: Array[String]): Unit = {
val list = List(1,2,5,8,20)
list.foreach(x=>{
println(s"${Thread.currentThread().getName} --- ${x}")
} )
println("-"*100)
val list2 = list.par
list2.foreach(x=>{
println(s"${Thread.currentThread().getName} --- ${x}")
} )
}
}
集合常用函数
基本属性操作
package tcode.chapter07
object $13_CollectionField {
def main(args: Array[String]): Unit = {
val list = List(1,5,3,7,10,2)
//是否包含某个元素
println(list.contains(100))
//是否为空
println(list.isEmpty)
//获取集合长度
println(list.length)
println(list.size)
//将集合转成字符串
println(list)
println(list.mkString("#"))
}
}
衍生集合
package tcode.chapter07
object $14_CollectionPar {
def main(args: Array[String]): Unit = {
val list = List(10,2,5,6,3,90,8,4,10)
//去重 !!!
println(list.distinct)
//删除前多少个元素,保留剩余其他元素
println(list.drop(3))
//删除后多少个元素,保留剩余其他元素
println(list.dropRight(3))
//获取第一个元素 !!!
println(list.head)
//获取最后一个元素 !!!
println(list.last)
//获取除开最后一个元素的所有元素
println(list.init)
//反转 *****
println(list.reverse)
//获取子集合
println(list.slice(0, 3))
//滑窗 !!!
//size: 窗口的长度
// 内部是元祖,外部是list:List((),(),())
//step: 滑动长度
println(list.sliding(4, 3).toList)
//获取除开第一个元素的所有元素
println(list.tail)
//获取前多少个元素 !!!
println(list.take(3))
//获取后多少个元素
println(list.takeRight(3))
//交集
val list2 = List(1,2,3,4,5)
val list3 = List(4,5,6,7,8)
println(list2.intersect(list3))
//并集
println(list2.union(list3))
//差集[A差B的结果就是A中有B中没有的元素]
println(list2.diff(list3))
//拉链
val list4 = List("aa","bb","cc","dd")
val list5 = List(10,20,30)
val list6 = list4.zip(list5)
println(list6)
//反拉链
println(list6.unzip)
//将元素与角标拉链
println(list4.zipWithIndex)
}
}
集合初级函数
聚合
list.max
list.min
list.sum
list.maxby
list.minby
排序
list.sorted
list.reverse
list.sortBy
list.sortWith
package tcode.chapter07
import scala.math.Ordering
object $15_CollectionLowFunction {
def main(args: Array[String]): Unit = {
val list = List(10,3,5,7,2,20)
//获取最大值
println(list.max)
//获取最小值
println(list.min)
//求得总和
println(list.sum)
//根据指定字段获取最大值
//maxBy(func: 集合元素类型 => B )
//maxBy是根据函数的返回值进行排序之后取最大元素
//后续会将集合每个元素当做参数传递给函数,maxBy中的函数是集合有多少元素就调用多少次
val list2 = List[(String,Int,Int)](
("zhangsan1",20,3000),
("zhangsan4",16,4000),
("zhangsan4",30,4000),
("zhangsan2",15,2500),
("zhangsan3",33,1500)
)
val func = (x:(String,Int,Int)) => x._2
println(list2.maxBy(func))
//直接传递函数值
println(list2.maxBy((x:(String,Int,Int)) => x._2))
//省略函数参数类型
println(list2.maxBy((x) => x._2))
//函数参数只有一个,()可以省略
println(list2.maxBy( x => x._2))
// 使用_代替
println(list2.maxBy( _._2))
//根据指定字段获取最小值
//minBy(func: 集合元素类型=>B )
//minBy是根据函数的返回值排序之后取最小值
//后续会将集合每个元素当做参数传递给函数,minBy中的函数是集合有多少元素就调用多少次
println(list2.minBy(x => {
x._3
}))
//排序
//1、直接根据元素本身排序,默认升序【sorted】
val list3 = list.sorted
println(list3)
//降序
println(list3.reverse)
println(list2.sorted)
//2、根据指定字段排序[sortBy],默认升序 *****
//sortBy(func: 集合元素类型 => B )
//sortBy是根据函数的返回值进行排序
//后续会将集合每个元素当做参数传递给函数
val ordering = new Ordering[Int]{
override def compare(x: Int, y: Int): Int = {
if(x>y) -1
else if(x==y) 0
else 1
}
}
println(list2.sortBy(x => {
x._3 // 一定要在花括号内(之前因可省略而删除)打断点才能看到函数体的值
})(ordering))
//3、根据自己比较排序 sortWith
// 升序: 第一个参数>第二个参数
// 降序: 第一个参数<第二个参数
println(list.sortWith((x, y) => {
x > y
}))
}
}
集合高阶函数
过滤: filter(func: 集合元素类型=>Boolean)
filter是针对每个元素操作,后续会将集合每个元素当做函数的参数值传入<br /> filter是集合有多少个元素就调用多少次<br /> filter保留是函数返回值为true的数据
映射: map(func: 集合元素类型=> B ),
其实就是:val func = 集合元素类型 => B , map(func)
map的应用场景: 一对一
map中的函数也是针对集合每个元素操作,后续会将集合每个元素当做函数的参数值传入
val B = A.map( ..) 此时B集合的长度=A集合的长度
map一般用于转换[值的转换、类型的转换]
一般用于抽出(集合)元素进行操作
压平: flatten
flatten是针对集合嵌套集合的场景,会将第二层集合去掉<br /> flatten的场景: 一对多
压平转换类型 flatMap(func: 集合元素类型 => 集合) = map + flatten
flatMap中的函数是针对集合每个元素进行操作,集合有多少个元素,函数就调用多少次<br /> flatMap的应用场景: 一对多<br /> flatMap与flatten的区别:<br /> flatMap是先对元素进行转换之后再压平,flatten是直接压平不转换
遍历 foreach(func: 集合元素类型 => B ):Unit : 遍历
foreach中的函数是针对集合每个元素操作<br /> foreach与map的区别:<br /> map有返回值,foreach是没有返回值
分组 groupBy(func: 集合元素类型=> K): 根据指定字段分组
groupBy里面的函数是针对集合每个元素进行操作,groupBy分组是根据函数的返回值进行分组<br /> groupBy的结果是Map[K,V] 【K就是函数的返回值,也就是分组的key,V是分组的key对应原集合中的所有元素】
聚合reduce\fold
reduce(func: (集合元素类型,集合元素类型)=>集合元素类型): 从左向右计算
reduce是对集合中所有元素进行聚合<br /> reduce函数第一个参数第一次计算的时候初始值 = 集合第一个元素,第N次计算的时候第一个参数的值 = 第N-1次的结果<br /> reduceRight(func: (集合元素类型,集合元素类型)=>集合元素类型): 从右向左计算<br /> reduceRight是对集合中所有元素进行聚合.<br /> reduceRight函数第二个参数第一次计算的时候初始值 = 集合最后一个元素,第N次计算的时候第二个参数的值 = 第N-1次的结果
fold(初始值)(func: (集合元素类型,集合元素类型)=>集合元素类型): 从左向右计算
fold是对集合中所有元素进行聚合<br /> fold函数第一个参数第一次计算的时候初始值 = 指定默认值,第N次计算的时候第一个参数的值 = 第N-1次的结果<br /> foldRight(初始值)(func: (集合元素类型,集合元素类型)=>集合元素类型): 从右向左计算<br /> foldRight是对集合中所有元素进行聚合<br /> foldRight函数第二个参数第一次计算的时候初始值 = 指定默认值,第N次计算的时候第二个参数的值 = 第N-1次的结果
package tcode.chapter07
object $16_CollectionHightFunction {
def main(args: Array[String]): Unit = {
val list = List(10,2,5,6,7,9)
//过滤: filter(func: 集合元素类型=>Boolean)
// filter是针对每个元素操作,后续会将集合每个元素当做函数的参数值传入
// filter是集合有多少个元素就调用多少次
// filter保留是函数返回值为true的数据
val list2 = list.filter(x=> {
println(s"x=${x}")
x%2==0
})
println(list2)
//映射: map(func: 集合元素类型=> B )
//map的应用场景: 一对一
//map中的函数也是针对集合每个元素操作,后续会将集合每个元素当做函数的参数值传入
//val B = A.map( ..) 此时B集合的长度=A集合的长度
//map一般用于转换[值的转换、类型的转换]
val list3 = List("spark","hadoop","flume","kafka")
val list4 = list3.map( x => x.length )
println(list4)
//压平: flatten
//flatten是针对集合嵌套集合的场景,会将第二层集合去掉
//flatten的场景: 一对多
val list5 = List[List[Int]](
List(1,2),
List(4,5),
List(7,8)
)
val list6 = list5.flatten
println(list6)
val list7 = List[List[List[Int]]](
List(
List(1,2),
List(5,6)
),
List(
List(7,8),
List(9,10)
)
)
val list8 = list7.flatten.flatten
println(list8)
val list9 = List("aa","cc")
println(list9.flatten)
//flatMap(func: 集合元素类型 => 集合) = map + flatten
//flatMap中的函数是针对集合每个元素进行操作,集合有多少个元素,函数就调用多少次
//flatMap的应用场景: 一对多
//flatMap与flatten的区别:
// flatMap是先对元素进行转换之后再压平,flatten是直接压平不转换
val list10 = List("hadoop spark flume","kafka flink hello")
// val list11 = list10.map(x=> x.split(" "))
// val list12 = list11.flatten
// println(list12)
// 上面等价于:
val list11 = list10.flatMap(x=>x.split(" "))
println(list11)
//结果:List(hadoop,spark,flume,kafka,flink,hello)
//遍历:foreach(func: 集合元素类型 => B ):Unit : 遍历
//foreach中的函数是针对集合每个元素操作
//foreach与map的区别:
// map有返回值,foreach是没有返回值
list.foreach(x=>println(x))
//groupBy(func: 集合元素类型=> K): 根据指定字段分组
//groupBy里面的函数是针对集合每个元素进行操作,groupBy分组是根据函数的返回值进行分组
//groupBy的结果是Map[K,V] 【K就是函数的返回值,也就是分组的key,V是分组的key对应原集合中的所有元素】
val list13 = List( ("lisi","man","shenzhen"),("wangwu","woman","beijing"),("zhaoliu","man","beijing") )
val map2 = list13.groupBy(x=> x._3)
println(map2)
//reduce
//reduceRight
//fold
//foldRight
//聚合
//reduce(func: (集合元素类型,集合元素类型)=>集合元素类型): 从左向右计算
//reduce是对集合中所有元素进行聚合
//reduce函数第一个参数第一次计算的时候初始值 = 集合第一个元素,第N次计算的时候第一个参数的值 = 第N-1次的结果
val result = list.reduce((agg,curr) => {
println(s"agg=${agg} curr=${curr}")
agg-curr
})
println(result)
//reduceRight(func: (集合元素类型,集合元素类型)=>集合元素类型): 从右向左计算
//reduceRight是对集合中所有元素进行聚合
//reduceRight函数第二个参数第一次计算的时候初始值 = 集合最后一个元素,第N次计算的时候第二个参数的值 = 第N-1次的结果
println("-"*100)
val r1 = list.reduceRight((curr,agg)=>{
println(s"agg=${agg} curr=${curr}")
agg-curr
})
println(r1)
//fold(初始值)(func: (集合元素类型,集合元素类型)=>集合元素类型): 从左向右计算
//fold是对集合中所有元素进行聚合
//fold函数第一个参数第一次计算的时候初始值 = 指定默认值,第N次计算的时候第一个参数的值 = 第N-1次的结果
println("*"*100)
list.fold(100)((agg,curr)=>{
println(s"agg=${agg} curr=${curr}")
agg+curr
})
println("+"*100)
//foldRight(初始值)(func: (集合元素类型,集合元素类型)=>集合元素类型): 从右向左计算
// foldRight是对集合中所有元素进行聚合
//foldRight函数第二个参数第一次计算的时候初始值 = 指定默认值,第N次计算的时候第二个参数的值 = 第N-1次的结果
list.foldRight(200)((curr,agg)=>{
println(s"agg=${agg} curr=${curr}")
agg+curr
})
}
}