package org.rr.commons.collection; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * A List implementation which allows to define a filter which prevent to add some kind of values * to this list. */ public class FilterList<T> extends WrapperList<T> { public static interface Filter<T> { public boolean isFiltered(T value); } private Filter<T> filter; public FilterList(List<T> wrap, Filter<T> filter) { super(wrap); this.filter = filter; doFilter(); } private void doFilter() { List<T> toRemove = new ArrayList<>(); for(T t : toWrap) { if(filter.isFiltered(t)) { toRemove.add(t); } } toWrap.removeAll(toRemove); } @Override public boolean add(T e) { if(!filter.isFiltered(e)) { return super.add(e); } return false; } @Override public boolean addAll(Collection<? extends T> c) { return super.addAll(new FilterList<T>(new ArrayList<T>(c), filter)); } @Override public boolean addAll(int index, Collection<? extends T> c) { return super.addAll(index, new FilterList<T>(new ArrayList<T>(c), filter)); } @Override public T set(int index, T e) { if(!filter.isFiltered(e)) { return super.set(index, e); } return super.get(index); } @Override public void add(int index, T e) { if(!filter.isFiltered(e)) { super.add(index, e); } } }