【发布时间】: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 -> e.getKey().startsWith(prefix)).map(Map.Entry::getValue).mapToInt(Number::intValue).sum(); -
@AlexisC。同意比较并不完全公平。我有兴趣知道什么时候应该使用 Java 8,或者我以错误的方式使用流等
-
@Alexis C.:可以做得更短:
_map.entrySet().stream().filter(e -> e.getKey() .startsWith(prefix)) .mapToInt(Map.Entry::getValue).sum();
标签: java java-8 java-stream