使用附加值或新值扩展不可变映射

2022-09-03 09:48:32

就像 如何扩展 an 一样:ImmutableList

ImmutableList<Long> originalList = ImmutableList.of(1, 2, 3);
ImmutableList<Long> extendedList = Iterables.concat(originalList, ImmutableList.of(4, 5));

如果我有一个现有的地图,我该如何扩展它(或创建一个带有替换值的新副本)?

ImmutableMap<String, Long> oldPrices = ImmutableMap.of("banana", 4, "apple", 7);
ImmutableMap<String, Long> newPrices = … // Increase apple prices, leave others.
                                         //  => { "banana": 4, "apple": 9 }

(让我们不要寻求有效的解决方案,因为显然这在设计上并不存在。这个问题更寻求最惯用的解决方案。


答案 1

您可以显式创建构建器:

ImmutableMap<String, Long> oldPrices = ImmutableMap.of("banana", 4, "apple", 7);
ImmutableMap<String, Long> newPrices =
    new ImmutableMap.Builder()
    .putAll(oldPrices)
    .put("orange", 9)
    .build();

编辑:
如注释中所述,这不允许覆盖现有值。这可以通过遍历不同(例如 a )的初始值设定项块来完成。它绝不是优雅的,但它应该工作:MapHashMap

ImmutableMap<String, Long> oldPrices = ImmutableMap.of("banana", 4, "apple", 7);
ImmutableMap<String, Long> newPrices =
    new ImmutableMap.Builder()
    .putAll(new HashMap<>() {{
        putAll(oldPrices);
        put("orange", 9); // new value
        put("apple", 12); // override an old value
     }})
    .build();

答案 2

只需复制到新项目,添加项目,然后转换为新项目ImmutableMapHashMapImmutableMap

ImmutableMap<String, Long> oldPrices = ImmutableMap.of("banana", 4, "apple", 7);
Map<String, Long> copy = new HashMap<>(oldPrices);
copy.put("orange", 9); // add a new entry
copy.put("apple", 12); // replace the value of an existing entry

ImmutableMap<String, Long> newPrices = ImmutableMap.copyOf(copy);

推荐