map是什么意思(到处是map、flatMap,啥意思?)
最近入职一个有趣的年轻同事,提交了大量大量的代码 。翻开git记录一看,原来是用了非常多的java8的语法特性,重构了代码 。用的最多的,就是map、flatMap之类的 。
但是其他小伙伴不愿意了,虽然有的人感觉代码变的容易懂了,但有更多的人感觉代码变的很晦涩 。
那感觉就像是:脱了裤子放屁,多此一举 。
这些函数的作用域,根据级别,我觉得可以分为三类 。简直是无所不在 。
文章图片
不要过分使用我也不知道这些函数是从什么时候流行起来的,但它们与函数编程的关系肯定是非常密切的 。好像是2004年的Scala开始的 。
没什么神奇的,它们全部是语法糖,作用是让你的程序更简洁 。你要是想,完全可以用多一点的代码去实现 。不要为了炫技刻意去使用,物极必反,用不好的话,产生的效果会是非常负面的 。比如java,它并不是一门函数编程语言,那么lambda就只是一种辅助;而你用java那一套去写Lisp代码的话,也只会不伦不类 。
但语言还是要融合的,因为潮流就是这样 。不去看他们背后的设计,我们仅从api的语义表象,横向看一下它们所表达的东西 。
我们首先看一下其中的共性(注意:逻辑共性,并不适合所有场景),然后拿几个典型的实现,看一下在这个星球上,程序员们的表演 。
这些抽象的概念这些函数的作用对象,据说是一种称之为流的东西 。那流到底是一种什么东西呢?请原谅我用一些不专业的话去解释 。
不论是在语言层面还是分布式数据结构上,它其实是一个简单的数组 。它有时候真的是一个简单的数组,有时候是存在于多台机器的分布式数组 。在下文中,我们统称为数组流 。
我们简单分为两类 。
语言层面的:比如Java的Stream分布式层面的:比如Spark的RDD它们都有以下几个比较重要的点 。
函数可以作为参数
C语言当然是没问题的,可以把函数作为指针传入 。但在不久之前,在Java中,这还得绕着弯子去实现(使用java概念中的Class去模拟函数,你会见到很多Func1、Func0这样奇怪的java类) 。
函数作参数,是使得代码变得简洁的一个必要条件 。我们通常的编程方法,大多是顺序执行一些操作 。
array = new Array()array = func1(array)if(func2(array)){ array = func3(array)}array = func4(array)而如果函数能够当参数,我就能够尽量的将操作平铺 。最终,还是要翻译成上面的语句进行执行的 。
array = new Array()array.stream().map(func1).filter(func2).flatMap(func3).sorted(func4)...编程模式完全变了,函数也有了语义 。
sequential & parallel
如果我们的数组流太大,对于单机来说,就有顺序处理和并行处理两种方式 。
通常,可以通过parallel函数进入并行处理模式 。对于大多数本地操作,开了并行不见得一定会快 。
java中使用ForkJoin那一套,线程的速度,你知道的…
而对于分布式数据流来说,本来就是并行的,这种参数意义就不大了 。
函数种类
一般作用在数据流上的函数,会分为两类 。
转换 。Transformation动作 。Action转换,典型的特点就是lazy 。
只有action执行的时候,才会真正参与运算 。所以,你可以认为这些转换动作是一套被缓冲的操作 。典型的函数如:map、flatMap等 。它们就像烤串一样被串在一起,等着被撸 。
动作 。真正触发代码的运行,上面的一系列转换,也会像开了闸的洪水一样,一泻而下 。典型的如reduce函数,就是这种 。
- 大家都在刷“张同学”,到底刷的是什么?
- 从放烟花到弹钢琴,疫情防控的“温情”背后是什么
- 动解|元宇宙,几个意思?
- 殷世航和韩安冉的关系怎么样 连麦是什么时候
- 我慢慢的听雪落下的声音是什么歌 《延禧攻略》插曲及片尾曲
- 萌德卡妹宣布分手 萌德卡妹为何分手是什么时候交往的
- 芈月传芈瑶第几集出现 芈瑶最后的结局是什么
- 何炅谢娜是什么关系 何炅的父亲何畏为什么被叫老赖
- 白百何为什么叫京圈太子妃 白百何和文章是什么关系
- 闪光的乐队是什么类型的综艺 闪光的乐队嘉宾阵容有谁
