Почему возникает исключение Unsupported, когда я пытаюсь выполнить код ниже? - PullRequest
0 голосов
/ 04 августа 2020
public void process(List<? extends Student> list) {
  List<Student> list = (List<Student>) items;
  for (Student student : list) {
    if (student.getAge > 60) {
      list.remove(student);
    }
  }
}

Приведенный выше код вызывает исключение unsupportedOperation в строке list.remove (student). это из-за "Список list "в параметрах метода?

Ответы [ 2 ]

3 голосов
/ 04 августа 2020

это из-за "Список list "в параметрах метода?

Нет.

Это потому, что вы передаете List, который не поддерживает операцию remove. Это необязательная операция .

Кроме того, если вы не получили UnsupportedOperationException, вы, скорее всего, получите ConcurrentModificationException, потому что вы удаляете из List, что вы итерация.

Более простой и правильный способ (на List, который поддерживает удаление):

list.removeIf(s -> s.getAge() > 60);

Если вам нужно что-то сделать с удаляемым элементом, используйте an Iterator:

Iterator<? extends Student> it = list.iterator();
while (it.hasNext()) {
  Student s = it.next();
  if (s.getAge() > 60) {
    s.remove();
    // Do whatever.
  }
}

Однако имейте в виду, что удаление из середины списков (например, ArrayList) в al oop неэффективно.

0 голосов
/ 04 августа 2020

AndyTurner уже объяснил вашу проблему, я просто хочу добавить. Вы можете использовать Stream API, чтобы получить список удаленных студентов, а затем зарегистрировать их

List<Student> removedStudent = list.stream()
                                   .filter(s -> s.getAge() > 60)
                                   .collect(Collectors.toList());

Затем удалить из списка

list.removeIf(s -> s.getAge() > 60);

Вы можете использовать removeAll также, если вы переопределите метод equals

list.removeAll(removedStudent);

Примечание: Здесь getAge может быть полем, используйте только age или с геттером поля, например getAge()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...