说明
- 过滤 遍历一个集合并从中获取满足指定条件的元素组成一个新的集合
- 转化/映射(map)将集合中的每一个元素映射到某一个函数
- 扁平化 扁平化+映射 注:flatMap 相当于先进行 map 操作,在进行 flatten 操作集合中的每个元素的子元素映射到某个函数并返回新集合
- 分组(group) 按照指定的规则对集合的元素进行分组
- 简化(归约)
- 折叠
object CollectionAdvancedFunctions {def main(args: Array[String]): Unit = {val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)val nestedList = List(List(1, 2), List(3, 4), List(5, 6))// 1. 过滤(filter): 筛选偶数val evenNumbers = numbers.filter(_ % 2 == 0)println(s"Filtered even numbers: $evenNumbers") // List(2, 4, 6, 8, 10)// 2. 映射(map): 平方每个元素val squaredNumbers = numbers.map(x => x * x)println(s"Squared numbers: $squaredNumbers") // List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)// 3. 扁平化(flatten): 展开嵌套集合val flattenedList = nestedList.flattenprintln(s"Flattened list: $flattenedList") // List(1, 2, 3, 4, 5, 6)// 4. flatMap: 组合map和flattenval flatMapped = numbers.flatMap(n => List(n, n*10))println(s"FlatMapped list: $flatMapped") // List(1,10, 2,20,...,10,100)// 5. 分组(groupBy): 按奇偶分组val groupedNumbers = numbers.groupBy(n => if (n % 2 == 0) "even" else "odd")println(s"Grouped numbers: $groupedNumbers") // Map(odd -> List(1,3,5,7,9), even -> List(2,4,6,8,10))// 6. 归约(reduce): 计算乘积val product = numbers.reduce((a, b) => a * b)println(s"Product via reduce: $product") // 3628800// 7. fold: 带初始值的归约val sumWithFold = numbers.fold(100)(_ + _) // 初始值100 + 1+2+...+10println(s"Sum with fold: $sumWithFold") // 155// 8. 组合操作: 过滤奇数 -> 平方 -> 求和val combined = numbers.filter(_ % 2 != 0) // 过滤奇数 List(1,3,5,7,9).map(x => x * x) // 平方 List(1,9,25,49,81).sum // 求和 1+9+25+49+81 = 165println(s"Combined operations result: $combined") // 165} }
Reduce 方法
object TestReduce {def main(args: Array[String]): Unit = { val list = List(1,2,3,4)// 将数据两两结合,实现运算规则val i: Int = list.reduce( (x,y) => x-y ) println("i = " + i)// 从源码的角度,reduce 底层调用的其实就是 reduceLeft//val i1 = list.reduceLeft((x,y) => x-y)// ((4-3)-2-1) = -2val i2 = list.reduceRight((x,y) => x-y)println(i2)} }
Fold 方法
Fold 折叠:化简的一种特殊情况。
object TestFold {def main(args: Array[String]): Unit = { val list = List(1,2,3,4)// fold 方法使用了函数柯里化,存在两个参数列表// 第一个参数列表为 : 零值(初始值)// 第二个参数列表为: 简化规则// fold 底层其实为 foldLeftval i = list.foldLeft(1)((x,y)=>x-y)val i1 = list.foldRight(10)((x,y)=>x-y)println(i)println(i1)} }
复杂wordcount实验案例
object WordCount {def main(args: Array[String]): Unit = {// 示例输入文本val text = """Hello Scala world|Hello Spark world|Scala is awesome|Spark is powerful""".stripMargin// 多步骤处理流程val wordCounts = text.split("\n") // 按行切割.flatMap(line => line.trim.replaceAll("[^a-zA-Z ]", "") // 去除非字母字符.toLowerCase() // 统一小写.split("\\s+") // 按任意空格分割).filter(_.nonEmpty) // 过滤空字符串.groupMapReduce(identity)(_ => 1)(_ + _) // 分组统计.toList.sortBy(-_._2) // 按词频降序排序// 打印结果println("Word Count Results:")wordCounts.foreach { case (word, count) => println(f"$word%-10s $count%3d")}}
}