定义一个断言接口,里面只有一个抽象方法。
public interface Predicate<E> { boolean test(E e); }
设计一个Lsit,直接继承ArrayList
public class SuperList<E> extends ArrayList<E>{ private static final long serialVersionUID=1L; SuperList<E> filter(Predicate<E> p){ for(int i=0;i< this.size();i++){ if(!p.test(this.get(i))){ this.remove(i); i--; } } return this; } @Override public String toString(){ return super.toString(); } }
filter 方法直接返回this,方便链式调用。
测试:
SuperList<User> list=new SuperList<>(); list.add(new User("001","夏洛特",null,roleEnum.刺客.getCode())); list.add(new User("002","阿狸",null,roleEnum.射手.getCode())); list.add(new User("003","刘禅",null,roleEnum.坦克.getCode())); list.add(new User("004","亚瑟",null,roleEnum.坦克.getCode())); list.add(new User("005","秀儿",null,roleEnum.坦克.getCode())); SuperList<User> filter =list.filter(new Predicate<User>(){ @Override public boolean test(User e){ return e.getRole()==roleEnum.坦克.getCode(); } }).filter(new Predicate<User>(){ @Override public boolean test(User e){ return !e.getUname().equals("秀儿"); } }); System.out.println(filter);
查询出所有的坦克类型,并且名字不是秀儿的数据。
结果:
[User [uid=003, uname=刘禅, role=2], User [uid=004, uname=亚瑟, role=2]]
因为JDK1.6不支持lamda表达式,所以只能使用匿名内部类了。