я решил дать ответ, потому что другие, похоже, бороться со списками, итераторы, ручьи, и так далее.
Во-первых, проблема:
Фрагмент кода, как этот
List<Mypojaclass> results = ...;
for (Mypojaclass sensor : results) {
if (sensor.getType.equals("JD") {
results.remove(sensor); // <-- possible CME here
}
}
глючит, потому что он может просто бросить ConcurrentModificationException
.Причина заключается в том, что для-каждой петли используется итератор, поэтому приведенный выше код эквивалентен следующему коду, который использует явный итератор:
List<Mypojaclass> results = ...;
for (Iterator<Mypojaclass> itr = result.iterator(); itr.hasNext();) {
Mypojaclass sensor = itr.next();
if (sensor.getType.equals("JD") {
results.remove(sensor);
}
}
Обратите внимание, что вы называете remove
в списке, а не на итератор. Итератор затем бросает CME, потому что список был изменен за пределами итератора.
Решение:
Вызовите remove
операцию на итератора:
List<Mypojaclass> results = ...;
for (Iterator<Mypojaclass> itr = result.iterator(); itr.hasNext();) {
Mypojaclass sensor = itr.next();
if (sensor.getType.equals("JD") {
itr.remove();
}
}
Теперь этот фрагмент кода перебирает раз через весь список, одновременно удаляя все вхождения датчиков типа которых равна " JD».
Java 8 Код:
Как мы теперь в времени AERA Java 8, это будет делать то же самое в Java 8:
results.removeIf(s -> s.getType().equals("JD"));
Или - с помощью потока и некоторые фильтры:
List<Mypojaclass> filtered = results
.stream()
.filter(s -> !s.getType().equals("JD"))
.collect(Collectors.toList());
results = filtered;
Обратите внимание, что предикат фильтра должен быть отменен. Вы не хотите иметь типы «JD». Вы хотите иметь все остальные типы.
Замечание по качеству кода: ваш фрагмент кода подразумевает, что у вас есть функция, которая должна собирать список объектов в виде списка результатов. И затем ваш метод начинает вносить изменения в другую структуру данных? Если это так: не делайте этого (если ваш метод на самом деле не похож на collectFooAndUpdateBar или что-то подобное). Я говорю: собирать что-то и обновлять что-то еще ... это то, что не принадлежит одному месту. – GhostCat
@MMMMS Вы хотите удалить все случаи, когда getType равно «JD» или только первое вхождение? –
У вашего вопроса есть ответ. Используя Iterator, вы можете получить POJO и удалить его, если тип равен JD. – Samurai