- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我一直在努力理解和展示 Java 流如何在幕后实现一种循环融合,以便可以将多个操作融合到一个过程中。
这里是第一个例子:
Stream.of("The", "cat", "sat", "on", "the", "mat")
.filter(w -> {
System.out.println("Filtering: " + w);
return w.length() == 3;
})
.map(w -> {
System.out.println("Mapping: " + w);
return w.toUpperCase();
})
.forEach(w -> System.out.println("Printing: " + w));
具有以下输出(每个元素的单 channel 融合非常清楚):
Filtering: The
Mapping: The
Printing: THE
Filtering: cat
Mapping: cat
Printing: CAT
Filtering: sat
Mapping: sat
Printing: SAT
Filtering: on
Filtering: the
Mapping: the
Printing: THE
Filtering: mat
Mapping: mat
Printing: MAT
第二个示例是相同的,但我在过滤器和映射之间使用了 sorted() 操作:
Stream.of("The", "cat", "sat", "on", "the", "mat")
.filter(w -> {
System.out.println("Filtering: " + w);
return w.length() == 3;
})
.sorted()
.map(w -> {
System.out.println("Mapping: " + w);
return w.toUpperCase();
})
.forEach(w -> System.out.println("Printing: " + w));
这有以下输出:
Filtering: The
Filtering: cat
Filtering: sat
Filtering: on
Filtering: the
Filtering: mat
Mapping: The
Printing: THE
Mapping: cat
Printing: CAT
Mapping: mat
Printing: MAT
Mapping: sat
Printing: SAT
Mapping: the
Printing: THE
所以我的问题就在这里,通过调用 distinct,我认为因为它是一个“有状态”的中间操作,所以它不允许在(所有操作的)单次传递期间单独处理单个元素.此外,由于sorted()有状态操作需要处理整个输入流才能产生结果,所以这里不能部署融合技术,所以所有的过滤都先发生,然后将映射和打印操作融合在一起,排序后?如果我的任何假设不正确,请纠正我,并随时详细说明我已经说过的话。
此外,它如何在幕后决定是否可以将元素融合到一个 channel 中,例如,当 distinct() 操作存在时,是否有一个简单的标志来关闭以阻止它发生就像不存在 distinct() 时一样?
最后一个问题是,虽然将操作融合到单次传递中的好处有时是显而易见的,例如,当与短路结合使用时。将 filter-map-forEach,甚至 filter-map-sum 等操作融合在一起的主要好处是什么?
最佳答案
无状态 操作(map、filter、flatMap、peek 等)完全融合;我们构建了一个级联的 Consumer
对象链,并将数据倒入其中。每个元素都可以独立于彼此进行操作,因此链中永远不会有任何“卡住”。 (这就是 Louis 所说的如何实现融合的意思——我们将各个阶段组合成一个大函数,并将数据提供给它。)
有状态 操作(distinct、sorted、limit 等)更复杂,并且其行为变化更大。每个有状态操作都可以选择它自己的实现方式,因此它可以选择尽可能少的侵入性方法。例如,distinct
(在某些情况下)让元素在经过审查时出来,而 sorted
是一个完整的障碍。 (不同之处在于懒惰的可能性有多大,以及它们如何处理诸如无限源之类的下游限制操作。)
的确,有状态操作通常会破坏融合的一些好处,但不是全部(上游和下游的操作仍然可以融合。)
除了您观察到的短路的值(value)之外,融合的其他重大优势包括 (a) 您不必在阶段之间填充中间结果容器,以及 (b) 您正在处理的数据是在缓存中总是“热”。
关于Java流操作融合和有状态中间操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35069055/
我输入了一个包含两个元素的 vector 。然后我将另一个元素 push_back 到它,并期望什么结果类型也是一个 vector 。但事实并非如此。 例子: typedef boost::fusio
首先让我先说,我以前在这里问过类似的问题,但从来没有得到解决我缺乏知识/问题的好答案。 首先,让我从一个分支策略提案开始。这就是我们的工作,我很高兴听到其他评论,以及为什么这很糟糕。但要明白它通常对我
所以我将一个带有 javascript 的字符串发送到 php 页面: if(cp.value!=''){ s+=cp.name +" LIKE '%"+ cp.value +"%'";
我有一个简单的问题,我该如何使用 which和 which.max同时。 我想选择最大值epnum为行 id == B13639J2 . 我需要检索 row number因为我需要对变量进行一些手动更
我想将带有 Groovy 脚本的文件上传到 Confluence。 As this Pythonscript example!我开始将代码翻译成 groovy, // Groovy def serve
我有一个融合 vector ,其元素具有多个不同类型的成员数据,我想创建一个新的融合 vector ,它将仅投影特定的数据成员。我已经对此进行了一段时间的研究,但没有任何进展。 #include #
我正在尝试使用 Python 的 xmlrpclib 创建一个新的页面以汇合。我已经知道如何更新现有页面的内容,但如何创建一个全新的页面? 我使用了以下脚本来更新内容: import xmlrpcli
我正在使用 Pow 在 Mac OS X 上为 Rack 应用程序提供服务。http://myapp.dev正确显示应用程序。在同一台机器上,我使用 VMware Fusion 运行 Windows
我检查了 Cassandra 和 Infinispan 的主要特性。它们似乎具有并提供非常相似的特性和功能: NoSQL 数据存储 坚持 去中心化 支持复制 可扩展性 容错 MapReduce 支持
我在Drupal 7网站中使用Search API和Elasticsearch Connector。我已经在AWS中托管了elasticsearch。搜索完美无误。但是我想像在Drupal.org搜索
我最近重新打开了几年前参与的一个项目。我写了一个小的 python 脚本来构建项目。我想将其移植到 CMake。 我遇到的问题是脚本使用了 pkg-config在 linux 上找到 fuse 头文件
我正在尝试访问 Yelp fusion API。我正在关注documentation并来到这段代码: const request = require('request'); // As you can
这是一个 vanilla Ubuntu 16.04 LTS,准确地说是基于 Xubuntu core。所以我需要自己安装包。除了 meld 之外,一切都很顺利,开始时,我会得到: (meld:4188
我正在尝试对惰性求值在 Java 流 API 中的应用形成一个简洁而连贯的理解。 这是我目前的理解: 元素仅在需要时才被消耗,即流是惰性的,中间操作也是惰性的,例如过滤器,仅在需要时进行过滤。 中间操
我使用 conluent jdbc-sink 将数据从 kafka 加载到 oracle。 但是我用数据编写了关于值(value)的模式。 我不想用数据编写模式,如何在 kafka 主题上编写模式,然
我在这里编写了一个 2D 融合套索代码。 [m n] = size(circle); cvx_begin variable theta(m, n); minimize( norm(ci
目前我正在开发一个使用 dx9 创建叠加层的应用程序。现在我遇到了一个问题,自从我将 Windows 10 升级到最新版本(Creators Update)后,它无法使用 alpha channel
我正在尝试编写类似 fiber 的代码,这样我就可以进入任务并从中退出。我试过的代码: class TaskActivity { CancellationTokenSource _m=new
我使用 NPM 在 React.js 中创建了一个前端。作为 IDE,我在这里使用 IntelliJ IDEA。该项目将使用我单独创建的 Spring Boot 编写的后端,也在 IntelliJ I
Cassandra 连接器在融合升级到 3.3.0 后失败。 Cassandra驱动的版本是3.3。堆栈如下。 [2017-09-14 08:56:28,123] ERROR java.lang.re
我是一名优秀的程序员,十分优秀!