【发布时间】:2017-03-27 20:48:54
【问题描述】:
我是 java 新手,我最初使用了一个 hashmap,并在上面做了一个 forEach,它工作得很好:
Map<String, Integer> testmap = new HashMap<>();
IntStream.range(0, 100).forEach(n -> {
testmap.put("teststring-" + Integer.toString(n), 1);
});
String x = testmap.entrySet().stream().filter(..);
但是,现在我有一个 ImmutableHashMap,我想做与上述相同的步骤,我该怎么做?我试过做
ImmutableMap.Builder<String, Integer> testmap = ImmutableMap.builder();
IntStream.range(0, 100).forEach(n -> {
testmap.put("teststring-" + Integer.toString(n), 1);
});
testmap.build();
String x = testmap.entrySet().stream().filter(...); // throws an error while compile
cannot find symbol
[javac] String testmap = testmap.entrySet().stream()
[javac] ^
[javac] symbol: method entrySet()
[javac] location: variable streams of type Builder<String,Integer>
谁能指出我在这里做错了什么?非常感谢您的帮助!
【问题讨论】:
-
你认为
testmap.build()是做什么的?您是否需要将返回值分配给某物...? -
无论如何,从
Stream内部改变外部变量是非常可怕的。可以使用Collectors.toMap在一行中重写您的第一个案例。您的第二种情况可以重写为使用自定义Collector。在深入了解 Java 8 之前,我强烈建议您多阅读一些有关 Java 8 的内容。 -
查看文档:google.github.io/guava/releases/snapshot/api/docs/com/google/… 并查看您自己的代码。实际上,您在任何地方都没有 Immutablemap,只有一个构建器来创建它。
-
您对错误的名称选择感到困惑。您将 ImmutableMap.Builder 命名为
testmap,这让您认为testmap是一个 Map,因为它曾经在您的第一个代码片段中。 在选择标识符名称时一定要小心!. -
顺便说一句,
Integer.toString(n)不需要;您只需使用"teststring-"+n即可获得所需的结果。