Я написал Predicate
код, который принимает любые Object
и тестирует его на следующих условиях:Predicate шаблонный метод
- если
Object
типString
и содержит"k"
, то он должен вернуть истинный. - если
Object
типInteger
и больше100
, тогда он должен возвращать true. - , если
Object
типEmployee
который является классом и имеет оклад работника более60000
, он должен возвращать true.
После написания, что Predicate
метод, который я написал remove
метод, который удаляет значения из списка в соответствии с Predicate
способом.
public class ConditionalRemove {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>(Arrays.asList("ramesh", "kushal", "suresh", "kc"));
System.out.println(conditionalRemove(list));
}
public static <T> List<T> conditionalRemove(ArrayList<T> list) {
ConditionCheck<T> cond = new ConditionCheck<>();
for (T t : list) {
if (cond.test(t)) {
list.remove(t);
}
}
return list;
}
static class ConditionCheck<T> implements Predicate<T> {
@Override
public boolean test(T t) {
if (t instanceof String) {
return (((String) t).contains("k"));
} else if (t instanceof Integer) {
return ((int) t > 100);
} else if (t instanceof Employee) {
return ((int) ((Employee) t).getSalary() < 60000);
}
return true;
}
}
}
После компиляции этого кода я нашел Exception in thread "main" java.util.ConcurrentModificationException
вы удаляете из списка в то время как вы итерацию его (в 'conditionalRemove()' Для того, чтобы исправить, сделать копию списка и итерацию, что – nbokmans
@nbokmans -. не надо - просто использовать итератор в явном виде. –
Возможный дубликат [Iterating throug ha Collection, избегая ConcurrentModificationException при удалении в цикле] (http://stackoverflow.com/questions/223918/iterating-through-a-collection-avoiding-concurrentmodificationexception-when-re) –