Java8-immutablemap for循环
我是java新手,最初我使用了hashmap,并在上面做了一个forEach,它工作得很好:Java8-immutablemap for循环,java,java-8,guava,Java,Java 8,Guava,我是java新手,最初我使用了hashmap,并在上面做了一个forEach,它工作得很好: Map<String, Integer> testmap = new HashMap<>(); IntStream.range(0, 100).forEach(n -> { testmap.put("teststring-" + Integer.toString(n), 1); }); String x = testm
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>
有人能指出我做错了什么吗?谢谢你的帮助 您必须从生成器生成地图。将代码更新为:
ImmutableMap.Builder<String, Integer> testmapBuilder = ImmutableMap.builder();
IntStream.range(0, 100).forEach(n -> testmapBuilder.put("teststring-" + Integer.toString(n), 1));
ImmutableMap<String, Integer> testmap = testmapBuilder.build();
//your code...
或者更新到这个
Map<String, String> testmap = IntStream.range(0, 100)
.mapToObj(Integer::toString)
.collect(collectingAndThen(toMap(n -> "teststring-" + n, o -> "1"), ImmutableMap::copyOf));
您必须从生成器生成地图。将代码更新为:
ImmutableMap.Builder<String, Integer> testmapBuilder = ImmutableMap.builder();
IntStream.range(0, 100).forEach(n -> testmapBuilder.put("teststring-" + Integer.toString(n), 1));
ImmutableMap<String, Integer> testmap = testmapBuilder.build();
//your code...
或者更新到这个
Map<String, String> testmap = IntStream.range(0, 100)
.mapToObj(Integer::toString)
.collect(collectingAndThen(toMap(n -> "teststring-" + n, o -> "1"), ImmutableMap::copyOf));
你认为testmap.build做什么?您是否需要将返回值分配给某个东西…?在任何情况下,从流内部变异外部变量都是非常可怕的。您的第一个案例可以使用Collectors.toMap在一行中重写。您的第二个案例可以重写为使用自定义收集器。我强烈建议您在深入了解Java8之前多阅读一些有关Java8的内容。实际上,你没有一个不可变的地图,只有一个构建器来创建一个。你会被你糟糕的名字选择弄糊涂。您将您的ImmutableMap.Builder命名为testmap,这使您可以认为testmap是一个映射,就像您在第一个被剪断的代码中使用的那样。选择标识符名称时一定要小心!。顺便说一下,不需要Integer.toString;您只需使用teststring-+n即可获得所需的结果。您认为testmap.build的作用是什么?您是否需要将返回值分配给某个东西…?在任何情况下,从流内部变异外部变量都是非常可怕的。您的第一个案例可以使用Collectors.toMap在一行中重写。您的第二个案例可以重写为使用自定义收集器。我强烈建议您在深入了解Java8之前多阅读一些有关Java8的内容。实际上,你没有一个不可变的地图,只有一个构建器来创建一个。你会被你糟糕的名字选择弄糊涂。您将您的ImmutableMap.Builder命名为testmap,这使您可以认为testmap是一个映射,就像您在第一个被剪断的代码中使用的那样。选择标识符名称时一定要小心!。顺便说一下,不需要Integer.toString;您只需使用teststring-+n即可获得所需的结果。