scala中map与flatMap浅析

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

大家好,又见面了,我是你们的朋友全栈君。

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

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

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))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135953.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月4日 上午8:20
下一篇 2022年5月4日 上午8:20


相关推荐

  • Hadoop1.2.0开发笔记(八)

    Hadoop1.2.0开发笔记(八)本人一贯的风格是先了解系统的基础部分 然后在深入到高级部分 如果违背这种循序渐进的次序 也超出了本人的接受能力 古人说 学有本末 事有终始 知所先后 则尽道矣 我们还是从基础开始吧 本人上文提到的开发图片服务器还是放到后面吧 本人在第一篇文章中描述的 WordCount 单词统计程序是在单机环境运行的 现在我们改造一下 改造成在单机伪分布环境中运行新建 WordCount 类 继承 Configur

    2026年3月18日
    1
  • Nginx转发ssh服务「建议收藏」

    Nginx转发ssh服务「建议收藏」一、需求当前置机需要转发内网主机的ssh端口号,方便外网直连服务器。二、nginx配置注:与events,http同级,配置stream即可events{worker_connections1024;accept_mutexon;}stream{ upstreamssh{ server10.11.4.78:22;#这里IP是虚拟机的,对应虚拟机的IP+Port } server{ listen9028;#外层通信需要的tc

    2022年10月18日
    2
  • Java中创建对象数组[通俗易懂]

    Java中创建对象数组[通俗易懂]1.对象数组的概念:如果一个数组中的元素是对象类型,则称该数组为对象数组。当需要一个类的多个对象时,应该用该类的对象数组来表示,通过改变下标值就可以访问到不同的对象。2.对象数组的定义和使用:对象数组的定义与一般数组的定义类似,但是需要为每一个元素实例化。3.对象数组的实例化:类名[]对象数组名=new类名[数组大小]以创建Student类的对象数组为例Student[]stu=newStudent[20];//创建20个学生对象对学生类的每一个数组元素进行

    2022年7月16日
    58
  • Python OpenCV findContours()函数与drawContours()函数用法

    Python OpenCV findContours()函数与drawContours()函数用法我用的Python3.6,OpenCV3.4。Python3.x与2.x语法不一样,OpenCV2.x与3.x也不一样。看之前得清楚自己用的啥。本文说白了就是个简单的查找轮廓,并且绘制轮廓。简单说一下这俩个函数用法。函数cv2.findContours()有三个参数。第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。而返回值根据OpenCV版本不同也不一样,但这俩个版本都会返回…

    2025年7月25日
    25
  • ubuntu clion激活码【2021.8最新】[通俗易懂]

    (ubuntu clion激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1STL5S9V8F-eyJsa…

    2022年3月27日
    117
  • ORA-02287: 此处不同意序号「建议收藏」

    ORA-02287: 此处不同意序号

    2022年1月28日
    59

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号