Java 8 map.replaceAll方法抛出UnsupportedOperationException

问题描述 投票:0回答:2

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

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)

我正在尝试用逗号替换值中的所有分号。

java string maps replaceall
2个回答
0
投票

正如@NiVeR所说,com.google.common.base.Splitter.split()返回的是不可修改的地图。

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

例如;

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

0
投票

您在显示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));
© www.soinside.com 2019 - 2024. All rights reserved.