代码之家  ›  专栏  ›  技术社区  ›  Jigar Naik

Java8 stream().map()。reduce()实际上是映射reduce

  •  1
  • Jigar Naik  · 技术社区  · 7 年前

    我在某处看到这段代码使用stream().map().reduce()。

    如果我在下面的特定用例中使用parallelStream()而不是stream()。

    谁能给我举个不使用parallelStream()的好例子吗

    下面的代码只是从tCode中提取tName并返回逗号分隔的字符串。

    String ts = atList.stream().map(tcode -> {
        return CacheUtil.getTCache().getTInfo(tCode).getTName();
    }).reduce((tName1, tName2) -> {
        return tName1 + ", " + tName2;
    }).get();
    
    2 回复  |  直到 7 年前
        1
  •  5
  •   Eugene    7 年前

    stream().map().reduce()

    你必须添加 parallel 或在其他情况下 parallelStream (取决于API,但这是同一件事)。使用并行 您将获得可用处理器的数量-1;但是主线程也用于 ForkJoinPool#commonPool ; 因此,通常会有2、4、8个线程等。要检查您将获得多少线程,请使用:

    Runtime.getRuntime().availableProcessors()
    

    您可以使用自定义池并获得所需数量的线程,如图所示 here .

    还要注意,整个管道是并行运行的,而不是 map 活动

    方法 并行化的好处太少了。

        2
  •  0
  •   Govind J    7 年前

    只有两种选择可以确保这种事情永远不会发生。第一个是确保提交到公共fork-join池的所有任务不会被卡住,并在合理的时间内完成。但说起来容易做起来难,尤其是在复杂的应用程序中。另一种选择是不使用并行流,等待Oracle允许我们指定用于并行流的线程池。

    用例

    别担心,stream是高效安全的。