【问题标题】:java 8 - immutablemap for loopjava 8 - 用于循环的不可变映射
【发布时间】: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 即可获得所需的结果。

标签: java java-8 guava


【解决方案1】:

您必须从构建器构建地图。将您的代码更新为:

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2019-10-13
    • 2017-03-21
    相关资源
    最近更新 更多