我正在尝试替换“;”用“,”
Map<String, String> params =// Random method
params.replaceAll((key, value) -> value.replaceAll(";", ","));
第2行引发以下异常。
java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableMap.replaceAll(Collections.java:1510)
我正在尝试用逗号替换值中的所有分号。
正如@NiVeR所说,com.google.common.base.Splitter.split()返回的是不可修改的地图。
您可以在开始修改值之前将不可修改的映射复制到可修改的映射。
例如;
Map paramMap = Splitter.on(",").withKeyValueSeparator(":").split(lineitem);
paramMap = Maps.newHashMap(paramMap);
paramMap.replaceAll((key, value) -> value.replaceAll(";", ","));
您在显示UnmodifiableMap的错误中看到了它。您正在使用一个不可修改的集合,这意味着它只有在创建后才能被读取。
查看代码的源代码:
public Map<String, String> split(CharSequence sequence) {
Map<String, String> map = new LinkedHashMap<String, String>();
for (String entry : outerSplitter.split(sequence)) {
Iterator<String> entryFields = entrySplitter.splittingIterator(entry);
checkArgument(entryFields.hasNext(), INVALID_ENTRY_MESSAGE, entry);
String key = entryFields.next();
checkArgument(!map.containsKey(key), "Duplicate key [%s] found.", key);
checkArgument(entryFields.hasNext(), INVALID_ENTRY_MESSAGE, entry);
String value = entryFields.next();
map.put(key, value);
checkArgument(!entryFields.hasNext(), INVALID_ENTRY_MESSAGE, entry);
}
return Collections.unmodifiableMap(map);
}
您会注意到它返回Collections.unmodifiableMap(map)
。
为了使其可修改,您可以简单地创建一个HashMap的新实例,例如:
Map paramMap = new HashMap<>(Splitter.on(",").withKeyValueSeparator(":").split(lineitem));