学习Collection中的判别式Predicate和迭代器Iterator

Predicate (判别式) 你需要在某个条件已被满足的时候执行相应的逻辑,此外还需要将此条件封装到对象里。 常见Predicate的实现

EqualPredicate

两个对象相等返回true(类似于Equals比较)

IdentityPredicate

两个对象的引用相同则返回true(类似于==比较)

NotPredicate

封装给定的Predicate对象并返回其相反值

InstanceOfPredicate

当对象属于构造函数接受到的类型时返回true

NullPredicate

当对象为null时返回true

NullIsTruePredicate

 

NotNullPredicate

当对象不为null时返回true

NullIsFalsePredicate

 

TruePredicate

总是返回true

FalsePredicate

总是返回false

UniquePredicate

当对象首次被评判时返回true,该实现内部维护了一个含有所有已评判对象的HashSet,如果当前对象存在于其中,则返回false。主要用于从Collection中去重。

自定义Predicate

public class MyPredicate implements Predicate {     public boolean evaluate(Object object){        boolean result = false;        User user = (User) object;        if(“男”.equals(user.getSex()) && “公安局”.equals(user.getCompany())){            result = true;        }        return result;     } }

应用例子:

User user = new User(“马家军”,”男”,”公安局”);        MyPredicate myPredicate = new MyPredicate();        Predicate nullPredicate = NullPredicate.INSTANCE;        Predicate isString = new InstanceofPredicate(User.class);        if(nullPredicate.evaluate(user)){            System.out.println(“user object is null”);        }        if(isString.evaluate(user)){            System.out.println(“user object”);        }        if(myPredicate.evaluate(user)){            System.out.println(“公安局男人”);        }else{            System.out.println(“不是公安局男人”);        }

运行结果:

user object 公安局男人

  Iterator(迭代器)

LoopingIterator

循环迭代器,可以循环访问某个Collection的内容

ArrayListIterator

遍历某个ArrayList的部分内容,比如下标0~20的元素(可以替代subList方法)

FilterIterator

遍历某个Collection中符合特定条件的元素,或者删除不符合条件的元素

UniqueFilterIterator

遍历某个Collection时跳过重复的元素

实例1——综合应用FilterIterator和Predicate选取符合特定条件的元素

User user1 = new User(“马加爵”,”男”,”招商局”);     User user2 = new User(“李刚”,”男”,”公安局”);     User user3 = new User(“马加爵”,”女”,”招商局”);     User user4 = new User(“李英”,”女”,”公安局”);     User user5 = new User(“马加爵”,”男”,”公安局”);     List users = new ArrayList();         users.add(user1);users.add(user2);users.add(user3);users.add(user4);users.add(user5);     Iterator gajMan = new FilterIterator(users.iterator(),myPredicate);     while(gajMan.hasNext()){        User tmp = (User)gajMan.next();        System.out.println(“公安局男人:”+tmp.getName());     }

运行结果:

公安局男人:李刚 公安局男人:马加爵

实例2——遍历Collection去掉重复的元素。

User user1 = new User(“马加爵”,”男”,”招商局”);     User user2 = new User(“李刚”,”男”,”公安局”);     User user3 = new User(“马加爵”,”女”,”招商局”);     User user33 = new User(“马加爵”,”女”,”招商局”);     User user4 = new User(“李英”,”女”,”公安局”);     User user5 = new User(“马加爵”,”男”,”公安局”);     User user55 = new User(“马加爵”,”男”,”公安局”);     List users = new ArrayList();         users.add(user1);users.add(user2);users.add(user3);users.add(user4);users.add(user5);users.add(user33);users.add(user55);     Iterator uniqueIterator = new UniqueFilterIterator(users.iterator());     while(uniqueIterator.hasNext()){         User user = (User)uniqueIterator.next();        System.out.println(“我是唯一:”+user.getName()+ “|” + user.getSex() + “|” + user.getCompany());     }

为了配合能够区分user3和user33、user5与user55是相同的元素,我们必须重载User类的equals()方法和hashCode()方法,如下所示:

@Override     public boolean equals(Object obj){        if(obj==null){            return false;        }        if(!(obj instanceof User)){            return false;        }        if(obj == this){            return true;        }        User user = (User)obj;        if(this.name.equals(user.name) && this.sex.equals(user.sex) && this.company.equals(user.company)){            return true;        }else{            return false;        }     }     private volatile int hashCode;     @Override     public int hashCode() {        int result = hashCode;        if(result == 0){            result = 17;            result = 31 * result + this.name.hashCode();            result = 31 * result + this.sex.hashCode();            result = 31 * result + this.company.hashCode();        }        return result;     }

运行结果:

我是唯一:马加爵|男|招商局 我是唯一:李刚|男|公安局 我是唯一:马加爵|女|招商局 我是唯一:李英|女|公安局 我是唯一:马加爵|男|公安局