地图是什么意思(地图,到处都是flatMap,什么意思?)

最近有个有趣的年轻同事加入公司,提交了大量代码 。查看git记录,我们通过使用java8的许多语法特性来重构代码 。最常用的有map,flatMap等等 。
但是其他朋友都不愿意 。虽然有人觉得代码变得容易理解,但更多的人觉得代码变得很晦涩 。
感觉就像:脱裤子放屁,干的不止一件事 。
这些职能的范围可以根据其级别分为三类 。几乎无处不在 。

地图是什么意思(地图,到处都是flatMap,什么意思?)

文章插图


不要过度我不知道这些函数是什么时候流行起来的,但是它们和函数编程的关系非常密切 。Scala好像是2004年开始的 。
【地图是什么意思(地图,到处都是flatMap,什么意思?)】没什么神奇的 。都是语法糖,作用是让你的程序更简洁 。如果你愿意,完整性可以通过多一点代码来实现 。不要为了炫技而刻意使用 。事情就会反过来 。如果用不好,后果会很负面 。比如java不是函数式编程语言,所以lambda只是一个帮助;如果你用java写Lisp代码,那只会不伦不类 。
但是语言还是要整合的,因为趋势是这样的 。我们不看他们背后的设计,只看他们从api的语义表示水平表达了什么 。
我们先来看看共性(注意:逻辑上的共性并不适合所有的场景),然后拿几个示例性的实现来看看程序员在这个星球上的表现 。
这些抽象的概念这些函数的对象被称为流 。小溪是一种什么东西?请原谅我用一些不专业的话来解释 。
它实际上是一个简单的数组,无论是语言还是分布式数据构造 。有时候真的是一个简单的数组,有时候是一个存在于多台机器中的分布式数组 。在下文中,我们统称为数组流 。
我们简单分为两类 。
语言层面的:比如Java的Stream散布式层面的:比如Spark的RDD他们都有以下主要的比较点 。
函数可以用作参数
c语言当然没问题,函数可以作为指针传入 。但就在不久前,在java中,这必须马上实现(使用java中的类概念来模仿函数,你会遇到许多奇怪的Java类,比如Func1和Func0) 。
函数作为参数是使代码简洁的必要条件 。我们通常的编程方法大多是按顺序执行一些操作 。
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)...编程模式完全变了,函数有语义 。
顺序& 。平行的
如果我们的数组流太大,单机有两种方法:顺序处理和并行处理 。
一般可以通过并行功能进入并行处理模式 。对于大多数本地操作,并行化不一定很快 。
ForkJoin在java中的应用,线程的速度,你懂的…
但是对于分布式数据流,是并行的,所以这个参数意义不大 。
功能类型
一般来说,作用于数据流的功能可以分为两类 。
转换 。Transformation动作 。Action转化,典型特征就是懒 。
只有动作完成了,它才会真正参与操作 。因此,您可以认为这些转换操作是一组缓冲操作 。地图、flatMap等典型功能 。它们像串串一样串在一起,等着被砸碎 。
行动 。当代码真正被触发运行时,上面的一系列转换也会像闸门一样泛滥下来 。典型的函数,比如reduce函数,是这样的 。
以上描述并不完全正确 。比如python的map,实现后可以输出结果 。让人没面子 。
地图和地图 。减少
说到map和reduce,大家都想到了hadoop 。然而,这不仅仅是大数据中的一个概念 。
对于他们的概念,我们只介绍下面两行 。
地图
将传入函数依次应用于序列的每个元素,并将结果作为新的数组流返回 。
减少
Reduce类似于递归概念 。最终会降低到一个值 。看这个公式:)
reduce([p1,p2,p3,p4],fn) = reduce([fn(p2,p4),fn(p1,p3)])我们来看看谷歌的经典论文 。
《地图简化:简化数据》
《大型集群上的处理》
https://ai.google/research/pubs/pub62
可以去看看吗?:)
地图和地图 。平面地图
经常用到这两个函数 。它们有以下不同之处:
地图
通过使用提供的函数,以一对一的对应关系对数组流中的每个值执行一次 。获取具有相同元素数量的数组流 。
地图是什么意思(地图,到处都是flatMap,什么意思?)

文章插图


平面地图
平就是平 。它应用提供的函数来逐个实现数组流中的每个值 。获取具有相同元素的数组流 。但是,里面的元素也是一个子数组流 。在将这些子阵列合并成一个阵列后,元素的数量将不同于原始阵列流的数量 。


推荐阅读