初始化 Guava ImmutableMap

Posted

技术标签:

【中文标题】初始化 Guava ImmutableMap【英文标题】:initializing a Guava ImmutableMap 【发布时间】:2012-03-18 08:44:26 【问题描述】:

Guava 为初始化地图提供了一个不错的快捷方式。但是,当我的地图初始化为九个条目时,我收到以下编译器错误(Eclipse Indigo)。

ImmutableMap 类型中的方法of(K, V, K, V, K, V, K, V, K, V) 不适用于参数 (String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)

ImmutableMap<String,String> myMap = ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4", 
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"
        );

消息似乎表明

一个 ImmutableMap 的最大大小为四对 key,value。

显然,情况并非如此,但我不知道该怎么做才能增加我的初始化程序的大小。

谁能告诉我缺少什么?

【问题讨论】:

【参考方案1】:

如果你想在功能和可读性之间取得平衡,你可以结合这两种方法:

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .putAll(ImmutableMap.of(
        "key1", "value1", 
        "key2", "value2", 
        "key3", "value3", 
        "key4", "value4"));
    .putAll(ImmutableMap.of(
        "key5", "value5", 
        "key6", "value6", 
        "key7", "value7", 
        "key8", "value8", 
        "key9", "value9"));
    .build();

这是否是个好主意,有待商榷。

【讨论】:

【参考方案2】:

请注意,您的错误消息仅包含五个 K, V 对,总共 10 个参数。这是设计使然; ImmutableMap 类提供了六种不同的of() 方法,接受零到五个键值对。没有接受 varags 参数的 of(...) 重载,因为 KV 可以是不同的类型。

你想要一个ImmutableMap.Builder

ImmutableMap<String,String> myMap = ImmutableMap.<String, String>builder()
    .put("key1", "value1") 
    .put("key2", "value2") 
    .put("key3", "value3") 
    .put("key4", "value4") 
    .put("key5", "value5") 
    .put("key6", "value6") 
    .put("key7", "value7") 
    .put("key8", "value8") 
    .put("key9", "value9")
    .build();

【讨论】:

感谢您的快速解答。我决定尝试 Guava,因为我不想输入标准地图初始化程序所需的所有“放置”。这么多的想法! @user903724:这里使用 Guava 的主要原因是其强大的不变性,IMO。 那个,或者稍微减少内存消耗 - 并且构建器语法非常流畅,随着事情的发展。 好吧,您可能还有多个 put,但它们现在使用的是 fluent API,因此无需为每个 .put 重复 myMap 请注意 Jon 的示例代码如何可以是 public static final 并且它仍然有效,不需要辅助方法或 static 初始化程序!【参考方案3】:

如果地图很短,你可以这样做:

ImmutableMap.of(key, value, key2, value2); // ...up to five k-v pairs

如果更长的话:

ImmutableMap.builder()
   .put(key, value)
   .put(key2, value2)
   // ...
   .build();

【讨论】:

除了可读性之外,您可以使用ImmutableMap.of静态工厂最多五个键值对。然后你必须使用builder。

以上是关于初始化 Guava ImmutableMap的主要内容,如果未能解决你的问题,请参考以下文章

Guava Cache的实现与源码分析

Guava 缓存和保留检查的异常

Java实用的工具

Java实用的工具

Java实用的工具

JAVA06_Optional类概述初始化常用方法最佳实践