Java 8 map.replaceAll 方法抛出 UnsupportedOperationException

Java 8 map.replaceAll method throws UnsupportedOperationException

我正在尝试替换“;”用“,”

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)

我正在尝试用逗号替换值中的任何分号。

您在错误中看到它说 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);
}

你可以注意到它 returns Collections.unmodifiableMap(map).

要使其可修改,您可以简单地创建一个 HashMap 的新实例,例如:

Map paramMap = new HashMap<>(Splitter.on(",").withKeyValueSeparator(":").split(lineitem));

正如@NiVeR 所说,com.google.common.base.Splitter.split() 正在返回一个不可修改的映射。

您可以在开始修改值之前将不可修改的映射复制到可修改的映射中。

例如;

Map paramMap = Splitter.on(",").withKeyValueSeparator(":").split(lineitem);
paramMap = Maps.newHashMap(paramMap);
paramMap.replaceAll((key, value) -> value.replaceAll(";", ","));