【问题标题】:Java 8 Performance over HashMap [closed]HashMap 上的 Java 8 性能 [关闭]
【发布时间】:2018-03-02 19:43:53
【问题描述】:

我要解决的问题是MapSumLeetCode Description。 简而言之,任务是对键值求和。

迭代映射 = 117 毫秒

Iterator<Entry<String, Integer>> it = _map.entrySet().iterator();
        int count = 0;
        while(it.hasNext()) {
            Entry<String, Integer> entry = it.next();
             String key = entry.getKey();
             int val = entry.getValue();
             if(key.startsWith(prefix)) {
                 count += val; 
             }   
        }

使用 Java 8 流 - 134 毫秒

int count = _map.keySet().stream()
                .filter(key -> key.startsWith(prefix))
                .map(str -> _map.get(str))
                .mapToInt(Number::intValue)
                .sum();

问题


  • 您是否应该避免可能使用 for 循环的 Streams?

或者我上面的代码是用non-streaming的方式写的

【问题讨论】:

  • 您可以通过stackoverflow.com/questions/44180101/…访问的少数链接之一
  • “Java Streams 的理想用例是什么?” 太宽泛 “你应该避免使用 for-loop 的 Streams 吗?” “Java 8 评估是懒惰还是急切?” 什么
  • 我不知道你如何对其进行基准测试,但是两个 sn-ps 是有区别的。在流一中,您仅在键集上进行迭代,这意味着您必须为每个键调用 get(例如,如果您使用哈希映射,则意味着重新计算哈希,这会增加额外的时间)。更公平的比较是_map.entrySet().stream().filter(e -&gt; e.getKey().startsWith(prefix)).map(Map.Entry::getValue).mapToInt(Number::intValue).sum();
  • @AlexisC。同意比较并不完全公平。我有兴趣知道什么时候应该使用 Java 8,或者我以错误的方式使用流等
  • @Alexis C.:可以做得更短:_map.entrySet().stream().filter(e -&gt; e.getKey() .startsWith(prefix)) .mapToInt(Map.Entry::getValue).sum();

标签: java java-8 java-stream


【解决方案1】:

您的流版本每个项目都有一个额外的get,这并不像您想象的那么快。试试这样:

int count = _map.entrySet().stream()
                .filter(ent-> ent.getKey().startsWith(prefix))
                .mapToInt(ent -> ent.getValue().intValue())
                .sum();

当然,在 Java 中正确地进行微基准测试并不容易,因此您的测量结果可能会出错。

但是,最后,流通常不是写东西的最快方式。在大多数情况下,性能损失非常小,而且语法比替代方案更清晰。

编辑:回答你的最后一个问题——流通常是懒惰地评估的。最后一步将项目拉过所有前面的步骤。

【讨论】:

  • .intValue() 的显式调用不是必需的。你可以简单地说.mapToInt(ent -&gt; ent.getValue())甚至.mapToInt(Map.Entry::getValue)
猜你喜欢
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 2012-09-18
  • 1970-01-01
相关资源
最近更新 更多