Java 8: удалить элемент из списка, если он не найден в ключе карты - PullRequest
0 голосов
/ 22 февраля 2019

Я хотел бы удалить все элементы списка, которые их последний разделенный символ не нашел в качестве ключа на какой-либо карте.Я использую следующий код:

   List<String> myList = Arrays.asList("a.b.c,c.d.e".split(","));
   myList.add("a.b.c");
   Map myMap = new HashMap();
   myMap.put("a","dumy");
   myList.removeIf(el->!myMap.containsKey(el.substring(el.lastIndexOf('.') + 1)));

Я получаю следующую ошибку: Method threw 'java.lang.UnsupportedOperationException' exception.

Есть идеи, что я сделал не так?

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

решается путем корректировки строки кода следующим образом:

List<String> myList = Lists.newArrayList(Arrays.asList("a.b.c,c.d.e".split(",")));
0 голосов
/ 23 февраля 2019

Чтобы немного объяснить причину, по которой добавление (и удаление) из ArrayList, созданного с помощью Arrays.asList (array), не разрешено и выдает UnsupportedOperationException, сначала мы знаем, что это Arrays.asList(...) делает для преобразованиямассив к его эквивалентному экземпляру ArrayList:

String[] strArr = new String[]{"a","b","c"};
List<String> strList = Arrays.asList(strArr);

Здесь происходит то, что ваш strArr на самом деле является резервным массивом для strList, что означает, что если вы измените strArr[0], тогда значение в strList.get(0) также последует примеру, и наоборот.Да, их значения будут синхронизированы и останутся согласованными друг с другом.Вот почему вы не можете делать добавление или удаление для strList, потому что резервный массив будет плакать и паниковать, поскольку он не сможет выполнить его, поскольку он имеет фиксированную длину (массивы всегда имеют фиксированный размер, как мы знаем, если вам нужно изменить размер массива, вам нужно полностью создать новый массив, изменить размер существующего невозможно);таким образом он выдает UnsupportedOperationException.

Таким образом, решение, как уже упоминалось @ByeBye, состоит в том, чтобы обернуть его ArrayList, чтобы он был новым независимым ArrayList без вспомогательного массива и имел бысвобода делать добавления и удаления.

0 голосов
/ 22 февраля 2019

Arrays.asList() создает список фиксированного размера.Вы не можете добавлять новые элементы или удалять элементы.

Вы можете использовать new ArrayList<>(Arrays.asList(el))

...