如何让番石榴的Splitter.split不返回不可修改的地图

时间:2018-02-22 16:54:48

标签: java guava

好像Splitter.MapSplitter方法返回一个不可修改的地图。有没有办法让它不返回一个不可修改的地图,以便我以后可以添加到该地图?或者我必须将不可修改的地图复制到常规地图中以添加?

Map<String, String> testParametersMap = new HashMap<String, String>();
testParametersMap = Splitter.on(",").withKeyValueSeparator(":").split(browser:chrome,browser-version:56,language:english);
testParametersMap.putIfAbsent("country", "US");

最后一行抛出异常......

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableMap.putIfAbsent(Collections.java:1515)

1 个答案:

答案 0 :(得分:3)

将结果复制到您选择的实现

Guava的Splitter总是返回不可变的集合,所以你不能让它返回可变的东西。相反,您应该将其结果复制到可变Map实现。

Map<String, String> testParametersMap = new LinkedHashMap<>(Splitter.on(",").withKeyValueSeparator(":").split("browser:chrome,browser-version:56,language:english"));
testParametersMap.putIfAbsent("country", "US");

或者,与您所写的内容类似,您应该使用putAll而不是重新分配变量:

Map<String,String> testParametersMap = new LinkedHashMap<>();
testParametersMap.putAll(Splitter.on(",").withKeyValueSeparator(":").split("browser:chrome,browser-version:56,language:english"));
testParametersMap.putIfAbsent("country", "US");

您可以使用任何实施,例如HashMapTreeMapLinkedHashMap等。正如Xaerxess在评论中提到的那样,赞成LinkedHashMap,因为它保留了订单或元素,如果这对你来说很重要。