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
运行结果:
公安局男人:李刚 公安局男人:马加爵
实例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
为了配合能够区分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; }
运行结果:
我是唯一:马加爵|男|招商局 我是唯一:李刚|男|公安局 我是唯一:马加爵|女|招商局 我是唯一:李英|女|公安局 我是唯一:马加爵|男|公安局