到处是map、flatMap,啥意思?

永利娱乐注册

  千锋JAVA开发学院3天前我要分享

我最近加入了一位有趣的年轻同事并提交了大量代码。通过git记录,结果证明了java8语法的很多功能,重构了代码。最常用的是map,flatMaps等。

但其他小伙伴不愿意,虽然有些人觉得代码变得容易理解,但更多的人觉得代码非常尴尬。

感觉就像这样:脱掉裤子和屁,做更多。

这些功能的范围,视水平而定,我认为可以分为三类。这简直无所不在。

不要过头了

我不知道这些功能何时受欢迎,但它们与功能编程的关系肯定非常接近。它似乎是2004年Scala的开始。

没有什么神奇的,它们都是语法糖,其作用是让你的程序更简洁。如果您愿意,可以使用更多代码来实现。不要为了技术故意使用它。该对象将被颠倒。如果你使用它很糟糕,效果将非常消极。例如,java,它不是一种函数式编程语言,那么lambda只是一种辅助;如果你使用Java编写Lisp代码,它只会是非描述性的。

但语言仍然需要合并,因为趋势是这样的。我们只关注api的语义表示,看看它们水平表达的内容,而不是查看它们背后的设计。

让我们首先看一下共性(注意:逻辑通用性,不适合所有场景),然后采取一些典型的实现,并观察地球上程序员的表现。

这些抽象概念

据说这些函数的对象叫做流。那流是什么样的?请原谅我用一些不专业的话来解释它。

无论是语言级还是分布式数据结构,它实际上都是一个简单的数组。它有时是一个简单的数组,有时是存在于多台机器上的分布式数组。在下文中,我们统称为阵列流。

我们简单地分为两类。

语言级别:例如Java的Stream分布级别:例如Spark的RDD

它们都有以下要点。

函数可以用作参数

C语言当然没问题,可以将函数作为指针传递。但不久前,在Java中,这必须围绕弯曲实现(使用Java概念中的类来模拟函数,你会看到许多奇怪的Java类,如Func1和Func0)。

件。我们通常的编程方法大多是按顺序执行某些操作。

阵列=newArrayarray=func1的(阵列)如果(FUNC2(阵列)){阵列=FUNC3(阵列)}阵列=FUNC4(数组)

如果函数可以是一个参数,我可以尝试尽可能平铺操作。最后,它仍然被翻译成上述执行声明。

阵列=newArrayarray.stream.map(func1的).filter(FUNC2).flatMap(FUNC3).sorted(FUNC4).

编程模式已完全改变,并且该函数具有语义。

Sequentialparallel

如果我们的阵列流太大,则对于单个机器有两种顺序处理和并行处理方式。

通常,可以通过并行功能输入并行处理模式。对于大多数本地操作,打开并行不一定快。

在java中使用ForkJoin,线程的速度,你知道.

对于分布式数据流,它们本质上是并行的,并且这些参数的含义并不重要。

功能类型

通常作用于数据流的功能分为两类。

转换。转型行动。操作

转换的典型特征是懒惰。

只有在执行操作时,它才会实际参与操作。因此,您可以将这些转换操作视为一组缓冲操作。典型的功能是:map,flatMap等。它们像叉子一样串在一起,等待被粉碎。

行动。实际的触发代码操作,上面的一系列转换,也会像打开大门的洪水一样冲下去。这是减少功能的典型特征。

上面的描述并不完全正确,比如python的map,你可以在执行后输出结果。这让人很不露面。

MapReduce的

当涉及到map和reduce时,每个人都会想到hadoop。但是,它不仅仅是大数据中的概念。

对于它们的概念,我们只介绍以下两行。

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

减少

Reduce类似于递归概念。最终它将减少到一个值。看看这个公式:)

减少([P1,P2,P3,P4],FN)=减少([FN(P2,P4),FN(P1,P3)])

具体来说,看看谷歌的经典论文。

MapReduce: SimplifiedData

ProcessingonLargeClusters

你能来看看吗?)

mapflatMap

经常使用这两个功能。它们有以下不同之处:

使用提供的函数将每个值放在数组流中,一对一对应。获取具有相同数量元素的数组流。

flatMap

平坦。它使用提供的函数一对一地执行数组流中值的每次传递。获取与元素相同的数组流。但是,里面的元素也是子数组流。在将这些子阵列合并到数组中之后,元素数量的概率与原始数组中的流的数量不同。

程序员的表现

Java8种流

从java8开始,我们添加了一个新的抽象,称为流:Stream。使用lambda语法,代码可以变得特别清爽和干净(Scala的快速发现)。

一个非常好的指南:

Spark的RDD操作

spark的核心数据模型是RDD,它是有向无环图。它表示一个不可变,可分区的集合,其元素可以并行计算。

它是分布式的,但我们可以查看下一个WordCount示例。

JavaRDDtextFile=sc.textFile();

JavaPairRDDcounts=TEXTFILE

.flatMap(S-Arrays.asList(s.split).iterator)

.mapToPair(字newTuple2(字,1))

.reduceByKey((A,B)-a + b)的

counts.saveAsTextFile();

多么熟悉的Api,你必须在Hadoop中看到它。

Flink的DataStream

Flink程序是执行分布式集合转换的常规程序(例如,过滤,映射,升级状态,加入,分组,定义窗口,聚合)。 Flink中的DataStream程序是在数据流上实现的转换。

我们来看看一段代码。

DataStreamtuple2counts=//splitupthelinesinpairs(2-tuples)包含:(word,1)text.flatMap(newTokenizer)//groupbythetuplefield0andsumuptuplefield1.keyBy(0).sum(1);

kafkastream的运作

Kafka已成为分布式流媒体计算平台。他抽象了一个KStream和KTable,类似于Spark的RDD,并且有类似的操作。

记录都对应于数据库中的每个更新。

我们来看看一段代码。

KTablewordCounts=文本行

.flatMapValues(值-Arrays.asList(value.toLowerCase.split(W +)))

.groupBy((键,值) - 值)

.Count之间;

wordCounts.toStream.to(流-单词计数输出,Produced.with(stringSerde,longSerde));

RxJava

RxJava是一个基于观察者模式的异步任务框架。人们经常看到它将用于Android开发(服务器也越来越多地使用)。

RxJava在语言层面做了一些创新,有一些忠实的粉丝。

语言水平lambda

当然,对于Haskell而言,它是一种自然的函数式编程语言,它带有一个光环。但是其他一些语言,包括脚本语言和编译语言,也吸收了这些经验。

它们统称为lambdas。

作为最流行的脚本语言,Python也有其lambda语法。最基本的功能,如map,reduce和filter也存在。

的JavaScript

无法下拉Js,例如Array.prototype。*。应该在那里,它会在那里。

还有很多,并没有逐一列出。换句话说,这些功能可以申请专利吗?虽然我很少使用它,但我非常喜欢它。

收集报告投诉

我最近加入了一位有趣的年轻同事并提交了大量代码。通过git记录,结果证明了java8语法的很多功能,重构了代码。最常用的是map,flatMaps等。

但其他小伙伴不愿意,虽然有些人觉得代码变得容易理解,但更多的人觉得代码非常尴尬。

感觉就像这样:脱掉裤子和屁,做更多。

这些功能的范围,视水平而定,我认为可以分为三类。这简直无所不在。

不要过头了

我不知道这些功能何时受欢迎,但它们与功能编程的关系肯定非常接近。它似乎是2004年Scala的开始。

没有什么神奇的,它们都是语法糖,其作用是让你的程序更简洁。如果您愿意,可以使用更多代码来实现。不要为了技术故意使用它。该对象将被颠倒。如果你使用它很糟糕,效果将非常消极。例如,java,它不是一种函数式编程语言,那么lambda只是一种辅助;如果你使用Java编写Lisp代码,它只会是非描述性的。

但语言仍然需要合并,因为趋势是这样的。我们只关注api的语义表示,看看它们水平表达的内容,而不是查看它们背后的设计。

让我们首先看一下共性(注意:逻辑通用性,不适合所有场景),然后采取一些典型的实现,并观察地球上程序员的表现。

这些抽象概念

据说这些函数的对象叫做流。那流是什么样的?请原谅我用一些不专业的话来解释它。

无论是语言级还是分布式数据结构,它实际上都是一个简单的数组。它有时是一个简单的数组,有时是存在于多台机器上的分布式数组。在下文中,我们统称为阵列流。

我们简单地分为两类。

语言级别:例如Java的Stream分布级别:例如Spark的RDD

它们都有以下要点。

函数可以用作参数

C语言当然没问题,可以将函数作为指针传递。但不久前,在Java中,这必须围绕弯曲实现(使用Java概念中的类来模拟函数,你会看到许多奇怪的Java类,如Func1和Func0)。

件。我们通常的编程方法大多是按顺序执行某些操作。

阵列=newArrayarray=func1的(阵列)如果(FUNC2(阵列)){阵列=FUNC3(阵列)}阵列=FUNC4(数组)

如果函数可以是一个参数,我可以尝试尽可能平铺操作。最后,它仍然被翻译成上述执行声明。

阵列=newArrayarray.stream.map(func1的).filter(FUNC2).flatMap(FUNC3).sorted(FUNC4).

编程模式已完全改变,并且该函数具有语义。

Sequentialparallel

如果我们的阵列流太大,则对于单个机器有两种顺序处理和并行处理方式。

通常,可以通过并行功能输入并行处理模式。对于大多数本地操作,打开并行不一定快。

在java中使用ForkJoin,线程的速度,你知道.

对于分布式数据流,它们本质上是并行的,并且这些参数的含义并不重要。

功能类型

通常作用于数据流的功能分为两类。

转换。转型行动。操作

转换的典型特征是懒惰。

只有在执行操作时,它才会实际参与操作。因此,您可以将这些转换操作视为一组缓冲操作。典型的功能是:map,flatMap等。它们像叉子一样串在一起,等待被粉碎。

行动。实际的触发代码操作,上面的一系列转换,也会像打开大门的洪水一样冲下去。这是减少功能的典型特征。

上面的描述并不完全正确,比如python的map,你可以在执行后输出结果。这让人很不露面。

MapReduce的

当涉及到map和reduce时,每个人都会想到hadoop。但是,它不仅仅是大数据中的概念。

对于它们的概念,我们只介绍以下两行。

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

减少

Reduce类似于递归概念。最终它将减少到一个值。看看这个公式:)

减少([P1,P2,P3,P4],FN)=减少([FN(P2,P4),FN(P1,P3)])

具体来说,看看谷歌的经典论文。

MapReduce: SimplifiedData

ProcessingonLargeClusters

你能来看看吗?)

mapflatMap

经常使用这两个功能。它们有以下不同之处:

使用提供的函数将每个值放在数组流中,一对一对应。获取具有相同数量元素的数组流。

flatMap

平坦。它使用提供的函数一对一地执行数组流中值的每次传递。获取与元素相同的数组流。但是,里面的元素也是子数组流。在将这些子阵列合并到数组中之后,元素数量的概率与原始数组中的流的数量不同。

程序员的表现

Java8种流

从java8开始,我们添加了一个新的抽象,称为流:Stream。使用lambda语法,代码可以变得特别清爽和干净(Scala的快速发现)。

一个非常好的指南:

Spark的RDD操作

spark的核心数据模型是RDD,它是有向无环图。它表示一个不可变,可分区的集合,其元素可以并行计算。

它是分布式的,但我们可以查看下一个WordCount示例。

JavaRDDtextFile=sc.textFile();

JavaPairRDDcounts=TEXTFILE

.flatMap(S-Arrays.asList(s.split).iterator)

.mapToPair(字newTuple2(字,1))

.reduceByKey((A,B)-a + b)的

counts.saveAsTextFile();

多么熟悉的Api,你必须在Hadoop中看到它。

Flink的DataStream

Flink程序是执行分布式集合转换的常规程序(例如,过滤,映射,升级状态,加入,分组,定义窗口,聚合)。 Flink中的DataStream程序是在数据流上实现的转换。

我们来看看一段代码。

DataStreamtuple2counts=//splitupthelinesinpairs(2-tuples)包含:(word,1)text.flatMap(newTokenizer)//groupbythetuplefield0andsumuptuplefield1.keyBy(0).sum(1);

kafkastream的运作

Kafka已成为分布式流媒体计算平台。他抽象了一个KStream和KTable,类似于Spark的RDD,并且有类似的操作。

记录都对应于数据库中的每个更新。

我们来看看一段代码。

KTablewordCounts=文本行

.flatMapValues(值-Arrays.asList(value.toLowerCase.split(W +)))

.groupBy((键,值) - 值)

.Count之间;

wordCounts.toStream.to(流-单词计数输出,Produced.with(stringSerde,longSerde));

RxJava

RxJava是一个基于观察者模式的异步任务框架。人们经常看到它将用于Android开发(服务器也越来越多地使用)。

RxJava在语言层面做了一些创新,有一些忠实的粉丝。

语言水平lambda

当然,对于Haskell而言,它是一种自然的函数式编程语言,它带有一个光环。但是其他一些语言,包括脚本语言和编译语言,也吸收了这些经验。

它们统称为lambdas。

作为最流行的脚本语言,Python也有其lambda语法。最基本的功能,如map,reduce和filter也存在。

的JavaScript

无法下拉Js,例如Array.prototype。*。应该在那里,它会在那里。

还有很多,并没有逐一列出。换句话说,这些功能可以申请专利吗?虽然我很少使用它,但我非常喜欢它。