如何让番石榴的 Splitter.split 不是 return 不可修改的地图
How to get guava's Splitter.split to not return an unmodifiable map
似乎 Splitter.MapSplitter 方法 return 是一个不可修改的映射。有没有办法让它不是 return 不可修改的地图,以便我以后可以添加到该地图?还是必须把不可修改的地图复制到普通地图中添加?
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
始终 return 不可变集合,因此您不能使其 return 可变。相反,您应该将其结果复制到可变 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");
您可以使用任何实现方式,例如 HashMap
、TreeMap
、LinkedHashMap
等。正如 Xaerxess 在评论中提到的,支持 LinkedHashMap
,因为它保留了顺序或元素,如果这对你很重要的话。
似乎 Splitter.MapSplitter 方法 return 是一个不可修改的映射。有没有办法让它不是 return 不可修改的地图,以便我以后可以添加到该地图?还是必须把不可修改的地图复制到普通地图中添加?
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
始终 return 不可变集合,因此您不能使其 return 可变。相反,您应该将其结果复制到可变 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");
您可以使用任何实现方式,例如 HashMap
、TreeMap
、LinkedHashMap
等。正如 Xaerxess 在评论中提到的,支持 LinkedHashMap
,因为它保留了顺序或元素,如果这对你很重要的话。