scala教程:集合的map映射转换、flatMap、reduce、groupBy分组、filter过滤、flatten扁平化

map()

将 集合 中的 每个元素 传入 函数 后,生成一个新元素,并将 新元素 组成一个 集合,并返回该集合

注意:map处理前后的元素数量是相同的

要向 map() 函数传递一个 函数

返回值类型

根据lambda表达式返回的类型,决定 m.map() 的返回类型

当lambda表达式返回类型是 2个元素的tuple 时,m.map() 的返回类型是 Map[Sring,Int]

lambda表达式返回类型是 其他类型时,m.map() 的返回类型是 immutable.Iterable

例子

将流中的每个数据乘2

val l=List(1,2,3,4)
val l2=l.map(_ * 2)
l2.foreach(println)

flatten

扁平化,如下面代码:List里面的每一个元素是List时(嵌套List),调用 flatten,可将里面的List的元素取出来组合成一个List

例子

val l=List(List(1,2),List(3,4),List(5,6))
l.foreach(println)

val l2=l.flatten
l2.foreach(println)

flatMap

相当于先调用 map() ,然后调用 flatten

针对迭代器的序列中的每个元素应用函数f,并返回指向结果序列的迭代器。

要向 flatMap() 传递一个函数,该函数要返回一个迭代器(也可以是集合)

例子

将集合 val l=List("李雷 lili","韩梅梅 lucy"),转成下面这种:

List(李雷, lili, 韩梅梅, lucy)

方式一

map()实现:

val l=List("李雷 lili","韩梅梅 lucy")

val l2=l.map(_.split(" ")) //l2是List,里面的元素是Array类型
for(it <- l2){
  for(it2 <- it){
    println(it2)
  }
}

方式二

通过 flatten 简化:

val l=List("李雷 lili","韩梅梅 lucy")

val l2=l.map(_.split(" ")).flatten
l2.foreach(println)

方式三

通过 flatMap() 一步到位:

val l=List("李雷 lili","韩梅梅 lucy")

val l2=l.flatMap(_.split(" "))
l2.foreach(println)

reduce()

reduce() 函数会对集合中元素进行聚合:

  1. 将集合中的 第 1、2 个元素传给 lambda表达式,计算后得出结果
  2. 再将该结果与第3个元素 传给 lambda表达式,计算后得出结果
  3. 以此类推,最后得到结果

例子

求集合元素累加和

val l=List(1,2,3,4)
val res=l.reduce(_ + _)
println(res)

groupBy

按照指定的规则对集合的元素进行分组,返回 Map,key是传入函数的计算结果,value是List类型(分到该组的元素)

例子

按照姓氏对姓名进行分组

val l=List("李雷","李四","韩梅梅","lili","lucy")
val m=l.groupBy(_.take(1))
println(m)

按照姓名进行分组

val l=List("李雷","lili","韩梅梅","lili","李雷","lucy")
val m=l.groupBy(e=>e)
println(m)

filter

根据规则 对数据进行 筛选过滤,符合规则的数据 保留,不符合规则的数据 丢弃。

例子

val l=List("李雷","韩梅梅","lili","lucy")
//集合中的元素,其首字母是l的,取出组成新集合
val l2=l.filter(_.take(1)=="l")
l2.foreach(println)

原文出处:/show_1IX1JjfisnSN.html