就像ImmutableList
可以这样扩展:
ImmutableList<Long> originalList = ImmutableList.of(1, 2, 3);
ImmutableList<Long> extendedList = Iterables.concat(originalList, ImmutableList.of(4, 5));
如果我有一个现有的Map,我该如何扩展它(或者用替换的值创建一个新的副本)?
ImmutableMap<String, Long> oldPrices = ImmutableMap.of("banana", 4, "apple", 7);
ImmutableMap<String, Long> newPrices = … // Increase apple prices, leave others.
// => { "banana": 4, "apple": 9 }
(Let我们并不寻求一个有效的解决方案,因为显然that doesn't exist by design。这个问题寻求的是最惯用的解决办法。)
5条答案
按热度按时间yhived7q1#
您可以显式地创建一个构建器:
编辑:
正如注解中所指出的,这将不允许覆盖现有值。这可以通过遍历不同
Map
(e.例如,HashMap
)。它一点也不优雅,但它应该起作用:dhxwm5r42#
只需将
ImmutableMap
复制到新的HashMap
中,添加项,然后转换为新的ImmutableMap
ahy6op9u3#
继续使用Guava,您可以创建一个实用程序方法,在构建新Map时跳过重复项。这是在
Maps.filterKeys()
的帮助下完成的。这就是效用函数:
下面是一个使用数据的单元测试(基于AssertJ)。
更新:这里有一个更优雅的基于
Maps.difference()
的实用函数的替代方案。l5tcr1uw4#
我已经用streams做过了,但它并不完美:
并且这仅插入或更新单个条目。请注意,可以放入ImmutableMap &关联的收集器(这是我实际使用的)
rsl1atfo5#
不是一个可怕的性能代码,但下面的工作