Scala flatmap() 我该怎么写?画图帮你搞懂 faltten 和 flatmap。

一、flatten

扁平化

用公司的管理架构举例。
公司架构
在这里插入图片描述
总经理管理经理,经理管理员工。
如果采用扁平化管理,那么就相当于总经理直接管理员工。抽掉中间的一层。

放在List 的嵌套结构中,如果 List 中的每个元素可分,那么就可继续像下拆分。
将 List 看成树形结构,List 里的一个元素,就是一个节点,元素用逗号分隔。

扁平化的本质就是减少中间层。
也就是说,一次 flatten 就抽掉 1 层,两次 flatten 就抽掉 2 层。
抽掉中间节点,根节点最外层的集合,直接把叶子节点(最下层节点)的每个元素,当做自己的元素。

直接看例子:

val list: List[List[Int]] = List(List(1, 2), List(3, 4))
println(list.flatten) //List(1, 2, 3, 4)

在这里插入图片描述

val list: List[String] = List("hello scala", "hello spark")
println(list.flatten)
//结果是 
//List(h, e, l, l, o,  , s, c, a, l, a, h, e, l, l, o,  , s, p, a, r, k)\
//因为组成字符串的基本元素是字符,因此得到上面的结果

在这里插入图片描述
如果我想按单词分割最后一层呢?
其实可以自定义分割规则,我们就需要给 flatten 传一个函数,最后返回的类型就是中间节点转换后的类型。

 val list: List[String] = List("hello scala", "hello spark")
 esult: List[String] = list.flatten((s) => {
     s.split(" ").toList
 })
 println(result) 
 //List(hello, scala, hello, spark)

在这里插入图片描述

那如果我集合是这样呢?好像不可以扁平化。
List(1, 2, 3, 4)
其实我们还是可以通过自定义规则来实现,看代码

// 看似不可扁平化,实际可以扁平化
val list = List(1, 2, 3, 4)
val result: List[Int] = list.flatMap((num) => {
    List(num * 2)
})
println(result)
//List(2, 4, 6, 8)

在这里插入图片描述

二、map

map 的作用是我们可以根据规则,把一个集合映射成另一个集合。
传进 map 中自定义函数的参数是集合的每个元素。集合中的一个元素调用一次 map 中的自定义函数。
看例子:
List("hello scala", "hello spark") --> List((hello,scala), (hello,spark))

 val list: List[String] = List("hello scala", "hello spark")
 val result: List[(String, String)] = list.map(
     s => {
         val strings: Array[String] = s.split(" ")
         (strings(0), strings(1))
     })
 println(result)
 //List((hello,scala), (hello,spark))

在这里插入图片描述

三、flatMap

flatmap 的功能就是,一次 flatten 一次 map 。 那么我们就要抽掉 2 层。 一层是 flatten 的, 一层是 map 的。

来看一个例子:

  • WordCount 单词切分
val datas: List[(String, Int)] = List(
    ("hello", 4),
    ("hello world", 3),
    ("hello scala flink", 2),
    ("hello spark scala hive hive", 1)
)
val wordsList: List[(String, Int)] = datas.flatMap(wordsAndCount => {
    wordsAndCount._1.split(" ").map(word => {
        (word, wordsAndCount._2)
    })
})
println(wordsList) 
// List((hello,4), (hello,3), (world,3), (hello,2), (scala,2)
// , (flink,2), (hello,1), (spark,1), (scala,1), (hive,1), (hive,1))
        

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值