Java8-immutablemap for循环

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

我是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>

有人能指出我做错了什么吗?谢谢你的帮助

您必须从生成器生成地图。将代码更新为:

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即可获得所需的结果。