当前位置:夜读资讯 > 历史故事 > map什么意义中文(map是什么功用)
来源:www.yeduzixun.com时间:2019-12-23编辑:极客教程

翻开git记载一看,原来是用了十分多的java8的语法特性,重构了代码。用的最多的,就是map、flatMap之类的。

可是其他小同伴不愿意了,固然有的人觉得代码变的容易懂了,可有越多的人觉得代码变的很晦涩。

那觉得就像是:脱了裤子放屁,多此一举。

这些函数的作用域,依据级别,我觉得能够分为三类。几乎是无所不在。

map什么意义中文(map是什么功用)(夜读头条网)

不要过火运用

我也不晓得这些函数是从什么时分盛行起来的,可它们与函数编程的关系肯定是十分亲密的。仿佛是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函数,就是这种。

以上的描绘也不尽然,比方python的map,执行后就能够输出结果。这让人很没面子啊。

map reduce

谈到map和reduce,各位就不谋而合的想到了hadoop。但是,它不只仅是大数据中的概念。

关于它俩的概念,我们仅做下面两行引见。

map

将传入的函数依次作用到序列的每个元素,并把结果作为新的数组流返回。

reduce

reduce相似于一个递归的概念。最终会归约成一个值。看看这个公式:)

reduce([p1,p2,p3,p4],fn) = reduce([fn(p2,p4),fn(p1,p3)])

详细还是看谷歌的经典论文吧。

《MapReduce: Simplified Data

Processing on Large Clusters》

https://ai.google/research/pubs/pub62

我们能访问么?:)

map flatMap

这两个函数经常被运用。它们有如下区别:

map

把数组流中的每一个值,运用所提供的函数执行一遍,逐个对应。得到元素个数一样的数组流。

map什么意义中文(map是什么功用)(夜读头条网)

flatMap

flat是扁平的意义。它把数组流中的每一个值,运用所提供的函数执行一遍,逐个对应。得到元素一样的数组流。只不过,里面的元素也是一个子数组流。把这些子数组兼并成一个数组以后,元素个数大约率会和原数组流的个数不同。

map什么意义中文(map是什么功用)(夜读头条网)

程序员们的扮演

java8种的Stream

java8开端,参加了一个新的笼统,一个称之为流的东西:Stream。配合lambda语法,能够使代码变的尤其的清新、洁净(有木有发现都快成了Scala了)。

一个十分好的导游:

https://stackify.com/streams~guide~java~8/

Spark的RDD操作

spark的中心数据模型就是RDD,是一个有向无环图。它代表一个不可变、可分区、其内元素可并行计算的汇合。

它是散布式的,可我们能够看下一个WordCount的例子。

JavaRDDtextFile = sc.textFile(hdfs://...);

JavaPairRDDcounts = textFile

.flatMap(s ~ Arrays.asList(s.split( )).iterator())

.mapToPair(word ~ new Tuple2(word, 1))

.reduceByKey((a, b) ~ a + b);

counts.saveAsTextFile(hdfs://...);

多么熟习的Api啊,我们必定在Hadoop里见过。

Flink 的 DataStream

Flink程序是执行散布式汇合转换(举一个例子,filtering, mapping, updating state, joining, grouping, defining windows, aggregating)的常规程序。Flink中的DataStream程序是完成在数据流上的transformation。

我们同样看一下它的一段代码。

DataStreamtuple2 counts =// split up the lines in pairs (2~tuples) containing: (word,1)text.flatMap(new Tokenizer())// group by the tuple field 0 and sum up tuple field 1.keyBy(0).sum(1);

kafka stream的操作

kafka曾经变成了一个散布式的流式计算平台。他笼统出一个KStream和KTable,与Spark的RDD相似,也有相似的操作。

KStream能够看作是KTable的更新日志(changlog),数据流中的每一个记载对应数据库中的每一次更新。

我们来看下它的一段代码。

KTablewordCounts = textLines

.flatMapValues(value ~ Arrays.asList(value.toLowerCase().split(\\W+)))

.groupBy((key, value) ~ value)

.count();

wordCounts.toStream().to(streams~wordcount~output, Produced.with(stringSerde, longSerde));

RxJava

RxJava是一个基于察看者形式的异步任务框架,经常看到会被用到Android开发中(效劳端采用的也愈来愈多)。

RxJava再言语层面停止了一些创新,有一局部忠诚的信徒。

言语层面的lambda

诚然,对Haskell这种天生的函数编程言语来说,是自带光环的。可其他的一些言语,包括脚本言语,编译性言语,也吸收了这些经历。

它们统称为lambda。

Python

作为最盛行的脚本言语,python同样也有它的lambda语法。最根本的map、reduce、filter等函数同样是存在的。

JavaScript

js也不能拉下,比方Array.prototype.*()等。它该有的,也都有了。

End

此外一点还有许多许多,就不逐个罗列了。话说,这些函数能够申请专利么?我很喜爱,固然我很少用。

声明提示:本篇文章为转载自网络,转载目的在于传递更多信息,不代表夜读资讯赞同其观点和对其真实性负责,或侵犯你的版权或其它问题,请联系本站,我们将第一时间删除内容!

信息聚合

    热门文章