java - 如何让 Guava 的 Splitter.split 不返回不可修改的 map

标签 java guava

似乎 Splitter.MapSplitter 方法返回一个不可修改的映射。有没有办法让它不返回不可修改的 map ,以便我稍后可以添加到该 map ?或者我必须将不可修改的 map 复制到常规 map 中才能添加?

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)

最佳答案

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

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,因为它保留顺序或元素。

关于java - 如何让 Guava 的 Splitter.split 不返回不可修改的 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48933070/

相关文章:

java - Kurento一对一视频通话录音Java

Java 注册提供者抛出 EOFException

java - 如何在秒表后以正确的格式显示日期?

asynchronous - Google Guava 中的 Function 和 AsyncFunction 有什么区别?

java - 使用 MultiMap 的优先级队列 - Java

Java SQLPreparedStatement和维护连接

java - Hadoop:所有数据节点 127.0.0.1:50010 都是坏的。中止

java - 您可以使用 Jenkins 部署到 Weblogic,然后针对部署运行 SoapUI 测试吗?

java - 只读 SettableFuture 引用

java - 在不覆盖 hashCode() 的情况下删除重复项