浅析scala中map与flatMap的区别

 更新时间:2019年06月16日 16:07:08   作者:流浪的小椅  
这篇文章主要介绍了浅析scala中map与flatMap的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

相关文章

  • 关于JDK8升级17及springboot 2.x升级3.x详细指南

    关于JDK8升级17及springboot 2.x升级3.x详细指南

    这篇文章主要介绍了关于JDK8升级17及springboot 2.x升级3.x的相关资料,还讨论了JPA包路径从javax改为jakarta,以及Spring Boot版本升级和Redis配置调整等,需要的朋友可以参考下
    2025-01-01
  • Spring Boot ActiveMQ发布/订阅消息模式原理解析

    Spring Boot ActiveMQ发布/订阅消息模式原理解析

    这篇文章主要介绍了Spring Boot ActiveMQ发布/订阅消息模式原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot中各个层级结构的具体实现

    SpringBoot中各个层级结构的具体实现

    在SpringBoot项目中,常常会把代码文件放入不同的包中,本文主要介绍了SpringBoot中各个层级结构的具体实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • java如何保证多个线程按一定顺序执行

    java如何保证多个线程按一定顺序执行

    这篇文章主要介绍了java如何保证多个线程按一定顺序执行问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • java/word+fusionchart生成图表深入分析

    java/word+fusionchart生成图表深入分析

    本文将以java/word+fusionchart生成图表问题深入解析,有兴趣的朋友可以参考下
    2012-11-11
  • JVM原理之完整的一次GC流程解读

    JVM原理之完整的一次GC流程解读

    这篇文章主要介绍了JVM原理之完整的一次GC流程解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Nacos-SpringBoot框架启动不加载bootstrap.yml的解决

    Nacos-SpringBoot框架启动不加载bootstrap.yml的解决

    这篇文章主要介绍了Nacos-SpringBoot框架启动不加载bootstrap.yml的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java超详细大文件分片上传代码

    Java超详细大文件分片上传代码

    文件上传是一个很常见的功能。在项目开发过程中,我们通常都会使用一些成熟的上传组件来实现对应的功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2022-06-06
  • 基于Tomcat7、Java、WebSocket的服务器推送聊天室实例

    基于Tomcat7、Java、WebSocket的服务器推送聊天室实例

    HTML5 WebSocket实现了服务器与浏览器的双向通讯,本篇文章主要介绍了基于Tomcat7、Java、WebSocket的服务器推送聊天室实例,具有一定的参考价值,有兴趣的可以了解一下。
    2016-12-12
  • Java关键字instanceof的两种用法实例

    Java关键字instanceof的两种用法实例

    这篇文章主要介绍了Java关键字instanceof的两种用法实例,本文给出了instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)及用于数组比较,需要的朋友可以参考下
    2015-03-03

最新评论