最新消息:欢迎各位技术大牛一起交流讨论,邮箱:gww0426@163.com

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

Java技术 郭伟伟 56831浏览 0评论

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<User> users = new ArrayList<User>();

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<User> users = new ArrayList<User>();

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;

}

运行结果:

我是唯一:马加爵|男|招商局

我是唯一:李刚|男|公安局

我是唯一:马加爵|女|招商局

我是唯一:李英|女|公安局

我是唯一:马加爵|男|公安局

转载请注明:郭伟伟@互联网 » 学习Collection中的判别式Predicate和迭代器Iterator


发表我的评论
取消评论

使用新浪微博登陆

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址