IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> scala笔记 —— 利用WordCount单词统计说明map、flatMap、groupBy函数的作用与区别 -> 正文阅读

[Java知识库]scala笔记 —— 利用WordCount单词统计说明map、flatMap、groupBy函数的作用与区别

使用scala实现,统计文件中每个单词的个数
在这里插入图片描述

import scala.io.Source

object demo14 {
  def main(args: Array[String]): Unit = {
    //读取文件
    val source = Source.fromFile("Scala/data/words.txt")
    
    //将读取到的数据放入一个List[String]类型的list集合中,每一行内容作为list的一个元素
    val list: List[String] = source.getLines().toList
    
    //通过flatMap加上split,将每一个元素,也就是文件中每一行的单词都单独拆出来,放入一个新的List集合中
    val wordList: List[String] = list.flatMap(line => {
      line.split(",")
    })
    
    //通过groupBy函数,将每一个单词作为key,将所有相同的单词构建成一个list集合,然后将key和list集合,作为键值对放入map集合中
    val wordsMap: Map[String, List[String]] = wordList.groupBy(w => w)
    
    //利用map函数对每一个元素,也就是每一个键值对进行处理,计算list集合的长度,即可得出相同单词的个数
    wordsMap.map({
      case (word:String,value:List[String]) => {
          word + "," + value.length
    }
    }).foreach(println)


    source.close()
  }
}

结果为
在这里插入图片描述

这里面用到了三个比较重要的函数,map函数,flatMap函数,groupBy函数
简单的说一下每个函数的作用

map函数

map函数,map(func),括号里面接收一个函数,为了方便描述,取名为func,func函数的参数类型与原集合(即map函数要操作的集合)里面元素的类型一致,函数的返回值由自己决定,通常以函数体的最后一行内容作为返回值

而map函数会将 func 函数应用到 原集合 的每一个元素上,映射产生一个新的元素。然后将每一个新元素都放入一个和 原集合 的类型大小都相同的新集合里面

举一个简单的例子

val list:List[Int] =List[Int](1,2,3,4,5)
val list_map: List[Int] = list.map(elem => {
    elem + 1
})

原集合的类型是 List[Int],因此map函数返回的结果也是 List[Int] 类型
原集合的元素的数据类型是 Int,因此传入map的 func 函数的参数类型也是Int,这里是匿名函数的简略写法, elem 实际上是 ( elem : Int )

flatMap函数

flatMap( func ),flatMap函数里面同样是接收一个 func函数,与map函数一样,会将这个func函数应用到原集合的每一个元素上

不同的是:flatMap 将某个函数应用到集合中的元素时,对每个元素都会返回一个新集合(而不是一个元素),然后,flatMap把生成的多个集合“拍扁”(或者说“融合”,“连成”)成为一个新的集合并返回。返回的集合与原集合类型相同,但大小可能不同,其中元素的类型也可能不同。

就以上面的代码为例子

val wordList: List[String] = list.flatMap(line => {
      line.split(",")
    })

原集合是一个 List[String] 类型的list,里面的每个元素都是一行文本内容
这里的 func函数的函数体是 line.split(",") ,由于 line 是原集合的一个元素,是一个字符串,字符串的内容是“java,python,scala”,所以这里可以调用 split() 方法,split() 方法会返回一个 array数组。因此这里 func函数 实际的返回值是 Array[String] 类型的数组

数组也是集合的一种,flatMap会对 func函数 生成的每个集合进行处理,拍扁成一维的list集合
因此flatMap函数的返回结果是 List[String]类型的list列表

关于 Map 和 flatMap 的区别

无论是map函数还是flatMap函数,在其内部,比如map(func),会根据func对每一个元素进行处理,每次处理都会产生一个返回值。在最后,map函数会自动将这些返回值再组合起来放入一个新的集合中,flatMap不过是在放入的时候加上了一个“拍扁”的处理

对于map,如果返回值是一个list,那么这些list最后会组成一个新的list,也就是 List [ list(1,2) , list(3) ]的形式,而flatMap会把每一个list里面的元素取出来,变成 List[ 1,2,3 ]的形式

关于什么时候使用map,什么时候使用flatMap
首先一定要明确,自己最终需要的元素是什么,然后看 map(func),func函数返回值是什么类型

如果返回值是集合,那么需要一个元素就是一个集合可以用map,如果需要的元素在返回值的集合里面,那么就需要flatMap,将元素都取出来

如果返回值不是集合,就是一个个的元素,直接使用map即可

groupBy函数

针对某一个分组字段进行分组,返回结果是一个Map集合
key值是分组字段,数据类型与分组字段的数据类型一致
value值是一个 List 集合,集合里面是分组的全部内容

分组字段通常是原集合的一个元素,或者是这个元素的某一部分
而整个分组,就是原集合全部元素中符合分组字段的元素,这些元素会进入同一个List集合中

同样拿上面的代码举例子

 val wordsMap: Map[String, List[String]] = wordList.groupBy(w => w)

w => w 表示的含义是按照元素本身作为分组字段,进行分组
经过flatMap后,此时原集合里面的一个元素,就是一个单词,比如 “java”
此时按照这个单词进行分组,结果是一个Map集合
在这里插入图片描述

最后再将每个Map集合传入map中,对每个元素应用模式匹配,计算每个List集合的长度,最后输出Map集合的 key 和 value的长度,即可得出每个单词的个数

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:00:25  更:2021-12-26 22:03:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:09:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码