Java 8 метод map.replaceAll выбрасывает исключение UnsupportedOperationException - PullRequest
0 голосов
/ 14 октября 2019

я пытаюсь заменить ";"с ","

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)

Я пытаюсь заменить любые точки с запятой в значениях запятой.

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

как сказал @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 голосов
/ 14 октября 2019

Вы видите в ошибке, что она говорит 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...