/*集合中的元素与函数间的映射
* Map
* 对集合中的每一个元素遍历使用该函数对其进行操作,即将集合中的每一个元素映射到某一个函数
* 如转换大小写,将list1中的每个元素都在函数中进行大小写转换
* map(f),输出为List(ALICE, HAHA, BOB)
* */
//转换大小写
val list1=List("Alice","Haha","Bob")
//1
val list2=list1.map(x=>x.toUpperCase())
println(list2)
list2.foreach(println)
//2
def f1(x:String):String={
x.toUpperCase()
}
val list2_1=list1.map(f1)
list2_1.foreach(println)
/*
* flatmap
* 扁平化,与map相比,将集合中的每个元素的子元素映射到某个函数并返回新集合
* flatmap(f),输出为List(A, L, I, C, E, H, A, H, A, B, O, B)
* */
val list3 = list1.flatMap(_.toUpperCase())
println(list3)
/*
* 折叠、化简
* */
//val list2=list1.map(x=>x.toUpperCase())
//化简为val list2=list1.map(_.toUpperCase()),_代表任意
//_代表当前元素,只能使用一次,不能使用第二次
val list4 =list1.map(_.toUpperCase())
val list4_1=list1.map(x=>x.toUpperCase()+x.toLowerCase())
val list4_2 = List(1,2,3,4,5,6)
//从左边进行减法操作,可替换为下面的方法
val result1=list4_2.reduceLeft(_-_)
val result1_1=list4_2.reduceLeft((result,x)=>(result-x))
//从右边进行加法操作
val result2=list4_2.reduceRight(_+_)
println(result1+" "+result2)
//fold,初始值为6,执行减法操作
val list5=List(1,2,3,4,8)
//初始值为6,执行减法操作
val list5_1=list5.fold(6)((result,x)=>(result-x))
//初始值为6,从右执行减法操作
val list5_2=list5.foldRight(6)(_-_)
println(list5_1)
println(list5_2)
//foldLeft和foldRight有一种缩写方法对应分别是:/:和:\
//初始值6,从右执行减法操作
val list5_3=(list5 :\ 6)(_-_)
println(list5_3)
//初始值6,从左开始执行减法操作
val list5_4=(6 /: list5)(_-_)
println(list5_4)
val sentence = "哇哇哇哇无无无哇无无哇无哇哇无无哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈刀哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈"
// 初始值 /:折叠统计集合((最终需要得到的结果)=> 结果计算规则)
val map = (Map[Char, Int]() /: sentence)((result, c) => result + (c -> (result.getOrElse(c, 0) + 1)))
//输出为:Map(哇 -> 8, 无 -> 8, 哈 -> 34, 刀 -> 1)
println(map)
/*
* 扫描:即对某个集合的所有元素做fold操作,但是会把产生的所有中间结果放置于一个集合中保存。
* 1到10,初始值为0,相加
* */
val scan = (1 to 10).scanLeft(0)(_+_)
//输出为:Vector(0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55)
println(scan)