以下代码打印100次true:
for(int i=0; i<100; i++) {
String s2 = Arrays.asList("A", "E", "I", "O", "U").parallelStream().reduce("x", String::concat, String::concat);
System.out.println("xAxExIxOxU".equals(s2));
}
当然,100次并不能保证。但是,即使这里使用的标识不符合文档中的“......对于所有u,combiner.apply(标识,u)等于u”的要求,我们仍然可以说从列表或任何其他固有有序结构派生的并行流的行为就像减少()中的顺序流一样返回相同的输出吗?
流的Javadoc。带有标识参数的reduce函数表示:
标识值必须是累加器函数的标识。这意味着对于所有t,accumulator.apply(标识,t)等于t。
这里的情况显然不是这样——“x”。concat(anything)不等于任何内容。此处唯一有效的标识值是“”。
如果您测试了问题标题的前提——通过查看非并行操作返回的内容——您会看到标题的答案是“否”——因为非并行流返回"xAEIOU"
为您的减少操作。
如果您将标识值从"x"
更改为"
,那么答案将是“是的,有这样的保证,因为您的减少函数是关联的并且对标识值的约束也得到满足。”
即使修改了标题,答案也很清楚:
您提供的标识值不是reduce函数的标识值,这违反了reduce函数的约定。因此,由于您违反了reduce方法的约定,因此所有担保都将失效。
很容易创建一个不成立的案例;就像霍尔格已经指出的那样,把你的名单扩大一些:
List<String> list = new ArrayList<>();
for (int i = 0; i < 500; i++) {
list.add("A");
}
String s2 = list.parallelStream().reduce("x", String::concat, String::concat);
System.out.println(s2);
if (s2.length() != list.size() * 2) {
System.out.println("Bad s2 size");
}
返回的迭代器是否保证按该顺序提供值 、、? 我知道和保证集合的值顺序正确。此外,我并不是在问如何从迭代器生成流。
我已经讨论了前面的几个问题,比如java stream中的遭遇顺序保存、Brian Goetz的回答,以及javadoc for stream。reduce()和java。util。流包javadoc,但我仍然无法理解以下内容: 以这段代码为例: 为什么减少总是保持遭遇顺序? 到目前为止,经过几十次运行,产量是相同的
在里面https://ci.apache.org/projects/flink/flink-docs-release-1.8/concepts/programming-model.html#parallel-数据流,有一个描述 操作符子任务的数量是该特定操作符的并行度。流的并行性始终是其生成操作符的并行性。同一程序的不同操作符可能具有不同的并行级别。 我不明白什么是流的并行性总是它的生成操作符的并
在Java8中运行以下流示例: 产量: 当然,这并不奇怪。由于http://docs.oracle.com/javase/8/docs/api/index.html?overview-summary.html,流是顺序执行还是并行执行并不重要: 顺便说一下:使用(首选的)而不是生成相同的结果,用于顺序和并行执行。 JVM详细信息:
问题内容: 在Java8中运行以下流示例: 产量: 当然-这并不奇怪。由于http://docs.oracle.com/javase/8/docs/api/index.html?overview- summary.html ,流是顺序执行还是并行执行都没有关系: 除了标识为明确不确定的操作(例如findAny())之外,流是顺序执行还是并行执行都不应该更改计算结果。 AFAIK 是确定性的并且是关
我有一个来自数据库的对象列表,我想使用类的方法过滤这个列表。新对象将不断添加到数据库中,因此对象列表可能会变得非常大,可能有数千个对象。我想使用来加快过滤过程,但我想知道对象列表应该大约有多大才能使用并行流。我已经阅读了这个线程:我应该在可能的情况下始终使用并行流吗?在这个线程中,他们同意如果您想从使用并行流中获得任何好处,数据集应该非常大。但是多大是大?假设我有200条记录存储在我的数据库中,我