最近一个新员工加入了一个有趣的年轻朋友,提交了很多代码。
打开git记录,原来大量使用了java8的英文语法特性来重构代码。最常用的有map,flatMap之类的。
但是,其他朋友不愿意。虽然有些人认为编码变得非常容易理解,但大量的人认为编码变得晦涩难懂。
感觉就是:脱裤子放屁,没必要。
按照级别,我认为这类功能的范围可以分为三类。真的是无处不在。
不要用得太多。
我不知道这类函数是什么时候出现的,但它们一定和函数的编程有着密切的联系。好像2005年的Scala才刚刚起步。
这没什么好的。都是语法上的糖,效果就是让你的程序流程更简单。如果你愿意,你可以多写一点代码。这样就不用装酷故意用了。如果用得不太好,实际效果会是非常负面的信息。比如Java,不是计算机语言,所以lambda只是辅助;但是如果用java写Lisp代码,都是一样的。
但是语言要结合,因为时尚潮流。不看他们背后的设计,就从api的语义现象来看他们横向表达的条目吧。
我们先来看看关联(注:逻辑关联并不适用于所有场景),再来看看程人在这个星球上的表现。
这个抽象的定义
据说这种涵洞的功效目标是一篇叫流量的文章。到底是一种流量?原谅我用一些不专业的词来表达。
它实际上是一个简单的数字能量阵列,无论是在语言上,还是在分布式系统的算法设计上。有时它真的是一个简单的数字能量阵列,有时它是存储在几个设备中的分布式系统数字能量阵列。在下文中,它通常被称为数字能量阵列流。
我们简单分为两类。
语言学:比如Java的流分布式系统:比如Spark的RDD
都有以下几个重点。
韩数可以作为主要参数。
c语言自然是一切正常,可以当表针来达到。但在不久前,在java中,这必须绕着弯子来做(通过应用java中定义的类来模拟仿真函数,可以看到许多怪异的Java类,如Func1和Func0)。
汉数作为主要参数是使编码越来越简单的必要条件。大多数人写程序是为了进行一些实际操作。
Array = new Array()Array = func 1(Array)if(func 2(Array)){ Array = func 3(Array)} Array = func 4(Array)
而如果函数能作为主参数,我就能尽量平滑实际操作。最后,要把上面这句话转化为实践。
array = new Array()array.stream()。映射(func1)。滤波器(func2)。平面图(功能3)。已排序(功能4)...
编程的方式完全变了,韩曙也有了文字的意义。
顺序并行
如果我们的数字能量阵流量很大,对于单机版会有顺序求解和并行计算两种方法。
一般根据并行函数可以实现并行计算。对于大多数本地实际操作,并行处理不一定很快。
java中ForkJoin的应用,进程的速度,你懂的…
而对于分布式系统的数据流分析,是并行处理的,所以这些主要参数的实际意义并不大。
功能类别
一般来说,数据流分析的功能可以分为两类。
转型。变换姿势。行动
转型的典型特征就是懒。
只有行动落实了,才会真正参与计算。所以你能感觉到这个姿势变化是一套缓存的实战操作。地图、平面地图等典型功能。它们像烤肉一样被串在一起,等着被卷起来。
姿势。真正的代码打开后,上面的一系列变化就会像打开了闸门的洪水。典型的,比如减少数量,就是这种。
上面的说法也不尽然,比如python的map,可以输出实现后的结果。这很丢脸。
地图缩小
提到map和reduce,我们都会想到hadoop。众所周知,不仅仅是互联网大数据的定义。
鉴于它们的定义,我们只做以下两行的详细介绍。
地图
传输函数被连续地应用于编码序列的每个元素,并且结果作为新的数字能量阵列被返回。
减少
Reduce类似于递归定义。最后会缩减为一个值。看这个公式:)
reduce([p1,p2,p3,p4],fn) = reduce([fn(p2,p4),fn(p1,p3)])
让我们实际阅读谷歌的经典论文。
《MapReduce:简化数据》
大型集群上的处理》
https://ai.googleesearch/pubs/pub62
你能浏览吗?:)
地图平面图
这两个函数经常用到。它们有以下不同之处:
地图
数字能量数组流中的每一个值都应该使用所给出的函数执行一次,并且应该实现一一对应。获得具有相同数量元素的数字能量阵列流。
平面地图
平就是平的意思。它将给出的函数应用于数字能量阵列流中的每个值,并进行一一对应。得到同样的数字能量阵列流。但是,里面的元素也是一串子数字能量阵列。在该子阵列被合并成数字能量阵列之后,素数元素的数量可能不同于原始数字能量阵列流的数量。
程的表演
八种java8流
在java8的开始,增加了一个新的抽象,一个叫做Stream: stream的项目。有了lambda英语的语法,编码可以非常清新整洁(如果你注意到的话,它将是Scala)。
一个好的指南:
Java 8中的Java流指南:带示例的深入教程
斯帕克RDD的实际操作
spark的核心数据库系统是RDD,它是一个有向无环图。意思是不能改变,可以系统划分,元素可以并行处理的组合。
它是一个分布式系统,但是你可以看到WordCount的下一个例子。
javardtextfile = sc . textfile(HDFS://...);
JavaPairRDDcounts =文本文件
。flat map(s-arrays . as list(s . split())。迭代器())
。mapToPair(word - new Tuple2(word,1))
。reduceByKey((a,b)-a b);
counts.saveAsTextFile(hdfs://...);
多么知名的Api啊。你一定在Hadoop里见过。
弗林克数据流
Flink程序流是实现分布式系统转换的基本程序流(例如,过滤、映射、更新状态、加入、分组、定义窗口、聚合)。Flink中的数据流程序流程是完成对数据流分析的转换。
让我们来看看它的一段代码。
DataStreamtuple2 counts =//将包含以下内容的行分成对(2元组):(word,1)text . flat map(new Tokenizer())//按元组字段0分组,并对元组字段1求和。sum(1);
卡夫卡流的实际操作
Kafka已经成为一个分布式流计算服务平台。他抽象了一个KStream和KTable,类似于Spark的RDD,也有类似的实际操作。
KStream可以看作是KTable的版本更新(changlog),数据流分析中的每一条记录都匹配数据库查询中的每一次升级。
让我们来看看它的一段代码。
KTablewordCounts = textLines
。flatMapValues(value-arrays . aslist(value . tolowercase()。拆分(\W)))
。groupBy((键,值)-值)
。count();
wordCounts.toStream()。to(streams-wordcount-output,Produced.with(stringSerde,long serde));
RxJava
Rx是基于观察者模式的多线程日常任务架构,在Android开发设计中经常使用(使用的服务器越来越多)。
Rx在RxJava重语言方面进行了一些自主创新,也有一些忠实的信徒。
语言的λ
自然Haskell等固有的计算机语言都有自己的光环。但其他语言,包括开发语言和编译编程语言,也吸收了这种工作经验。
它们通常被称为λ。
计算机编程语言
作为最流行的开发语言,python也有它的lambda英语语法。最基本的映射、还原、过滤等功能都有。
Java Script语言
Js也脱不了干系,比如Array.prototype.*()等。该有的,也有了。
目标
另外还有很多很多,不一一列举了。换句话说,这种涵洞可以申请专利吗?喜欢,虽然很少用。