当前位置: 首页 > 知识库问答 >
问题:

与流行为不同的平行流

杜俊爽
2023-03-14
    List<String> list = Arrays.asList("1", "2", "3");
    String resultParallel = list.parallelStream().collect(StringBuilder::new,
            (response, element) -> response.append(" ").append(element),
            (response1, response2) -> response1.append(",").append(response2.toString()))
            .toString();
    System.out.println("ResultParallel: " + resultParallel);

    String result = list.stream().collect(StringBuilder::new,
            (response, element) -> response.append(" ").append(element),
            (response1, response2) -> response1.append(",").append(response2.toString()))
            .toString();

    System.out.println("Result: " + result);

结果:1 2 3

有人能解释为什么会发生这种情况,以及我如何让非并行版本给出与并行版本相同的结果吗?

共有1个答案

秋阳荣
2023-03-14

另请注意,即使在组合器中用空格替换,结果仍然会有所不同(稍微修改了代码,使其更具可读性):

String resultParallel = list.parallelStream().collect(
            StringBuilder::new,
            (builder, elem) -> builder.append(" ").append(elem),
            (left, right) -> left.append(" ").append(right)).toString();

    String result = list.stream().collect(
            StringBuilder::new,
            (builder, elem) -> builder.append(" ").append(elem),
            (left, right) -> left.append(" ").append(right)).toString();


  System.out.println("ResultParallel: ->" + resultParallel + "<-"); // -> 1  2  3  4<-
  System.out.println("Result: ->" + result + "<-"); // -> 1 2 3 4<-

注意你的空间太多了。

java-doc有以下提示:

String.join(",", yourList)
yourList.stream().collect(Collectors.joining(","))
 类似资料:
  • 正如您所看到的,在平面映射之后,我应该得到从到的连续数字的有序流。我拆分了一次拆分器,所以它应该跳到某个中间位置。接下来,我从它中消耗一个元素,并再拆分一次。之后,我打印所有剩余的元素。我希望我将有几个连续的元素从流尾(可能零元素,也会很好)。然而,我得到的是和,然后突然跳转到。 我知道目前在JDK中拆分器不是这样使用的:它们总是在遍历之前拆分。但是,官方文档并没有明确禁止在之后调用。 当我使用直

  • 我知道在你的流中的任何时间点都可能发生再平衡。当它发生时,由于没有提交给定偏移量的最新偏移量,可能会发生事件的重新处理。 Kafka流是否允许在重新平衡发生之前完成任何飞行中处理?我的意思是,你的应用程序正在消耗一个记录(在你的过程方法内部),发生一个再平衡事件。该处理是否立即中止或允许处理方法完成? 一个具体的例子是 最后一次计算是否会在状态存储中结束并转发到接收器主题?因此,这意味着当重新平衡

  • 我有一个<code>std::tuple</code>,其中填充了从类模板实例化的对象和一个类型参数。现在我想在编译时从元组中获取一个具有指定类型参数的元素。代码如下: 这在gcc 4.8.4上编译正常,但在vs2015u2上不行。错误在中,它说: 错误 C2131:表达式未计算为常量 注意:失败是由非常量参数或对非常量符号的引用引起的, 请参阅“I”的用法 显然,编译器认为返回值不是conste

  • 问题内容: 切片是对基础数组的引用。这是有道理的,似乎可以在内置/原始类型上使用,但是为什么不能在结构上使用呢?我假设即使我更新了一个struct字段,引用/地址也仍然相同。 需要说明的是:我知道我可以在两种情况下都使用指针。我只是对为什么不更新结构感兴趣(与int不同)。 问题答案: 调用时要做的是传递一个包含值副本的新数组,并立即丢弃该数组。这与您使用基元不同,因为您保留了数组。 这里有两种方

  • 其中一个测试通过,另一个给出以下错误: java.lang.ClassCastException:类org.springframework.http.ResponseEntity不能强制转换为类org.junit.jupiter.api.function.executable(org.springframework.http.ResponseEntity和org.junit.jupiter.api

  • 1. 简介 行为流报告可以直观地展现用户从一个页面或事件到下一个页面或事件所经过的全部路径节点。通过对每一步行为、路径节点的分析,帮助您找出网站的潜在问题,进而制定完善的优化策略。 2. 使用说明 2.1 功能布局 行为流功能位于“行为分析”模块中,报告分为上半部的设置区域,与下方的分析结果展示区域。 2.2 基础设置操作 在分析云中,用户的每一个行为都可以用一个事件(包含页面浏览也是一个事件)来