欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅析scala中map与flatMap的区别

程序员文章站 2024-02-15 15:28:10
在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合。由于命令式编程语言也可以通过类似函数指针的方式来实现...

在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合。由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好处主要是不可变性带来的。没有可变的状态,函数就是引用透明(referential transparency)的和没有副作用(no side effect)。

任何一种函数式语言中,都有map函数与faltmap这两个函数,比如python虽然不是纯函数式语言,也有这两个函数。再比如在jdk1.8之后,也加入了lambda表达式,自然也支持map函数。

现在简单说说scala中这两个函数的用法。有一种观点认为将map和flatmap说成scala函数机制的核心都不为过分,其实是有一定道理的。因为实际中我们使用最多的场景就是对数据进行map操作或者flatmap操作。map函数的用法,顾名思义,将一个函数传入map中,然后利用传入的这个函数,将集合中的每个元素处理,并将处理后的结果返回。而flatmap与map唯一不一样的地方就是传入的函数在处理完后返回值必须是list,其实这也不难理解,既然是flatmap,那除了map以外必然还有flat的操作,所以需要返回值是list才能执行flat这一步。

总结:1. map会将每一条输入映射为一个新对象。{苹果,梨子}.map(去皮) = {去皮苹果,去皮梨子} 其中: “去皮”函数的类型为:a => b

2.flatmap包含两个操作:会将每一个输入对象输入映射为一个新集合,然后把这些新集合连成一个大集合。 {苹果,梨子}.flatmap(切碎) = {苹果碎片1,苹果碎片2,梨子碎片1,梨子碎片2} 其中: “切碎”函数的类型为: a => list<b>

废话不多说,看一个小例子就明白用法了。

object collection_t1 {
 
 def flatmap1(): unit = {
  val li = list(1,2,3)
  val res = li.flatmap(x => x match {
   case 3 => list('a','b')
   case _ => list(x*2)
  })
  println(res)
 }
 
 def map1(): unit = {
  val li = list(1,2,3)
  val res = li.map(x => x match {
   case 3 => list('a','b')
   case _ => x*2
  })
  println(res)
 }
 
 def main(args: array[string]): unit = {
  flatmap1()
  map1()
 }
}

将代码run起来,最后输出为:

list(2, 4, a, b)
list(2, 4, list(a, b))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。