如何在集合中筛选出满足条件的元素——org.apache.commons.collections4的使用

原创 2016年05月30日 22:15:17

如何在集合中筛选出满足条件的元素——org.apache.commons.collections4的使用

原来在一个集合中选出满足条件的元素:遍历 - 判断条件 - add到新的集合。

使用org.apache.commons.collections4的集合工具类CollectionUtils中的select方法

API:http://commons.apache.org/proper/commons-collections/javadocs/api-release/org/apache/commons/collections4/CollectionUtils.html

public static <O> Collection<O> select(Iterable<? extends O> inputCollection, Predicate<? super O> predicate)

inputCollection:被筛选的集合

Predicate:筛选的条件

对Predicate的理解

http://commons.apache.org/proper/commons-collections/javadocs/api-release/org/apache/commons/collections4/Predicate.html

抽象接口,实现对一个对象if条件判断,该接口只有一个方法boolean evaluate(T paramT);返回true或false,即是否满足条件

例子:

要实现对List<Person>的筛选

public class Person
{
    public static final String M = "male";
    public static final String FM = "female";

    private String name;

    private int age;

    private String sex;

    public Person(String name, String sex, int age)
    {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }   
}

实现一个Predicate用于判断是否性别sex为male,这里使用了匿名内部类

Predicate<Person> malePredicate = new Predicate<Person>()
{
    public boolean evaluate(Person paramT)
    {
        return StringUtils.equals(paramT.getSex(), Person.M);
    }
};

定义并实例化一个Predicate用于判断年龄大于某个值

public class AgeGreateThanPredicate<T extends Person> implements Predicate<T>
{
    private int age;

    public AgeGreateThanPredicate(int age)
    {
        this.age = age;
    }

    public boolean evaluate(Person paramT)
    {
        return paramT.getAge() > age;
    }
};

Predicate<Person> ageGreateThan20Predicate = new AgeGreateThanPredicate<Person>(20);

AndPredicate可以将两个Predicate进行与操作,还有NotPredicate、OrPredicate实现非与或操作

AndPredicate<Person> condition1 = new AndPredicate<Person>(malePredicate, ageGreateThan20Predicate);

测试代码:

@Test
public void test()
{
    //集合初始化
    List<Person> persons = new ArrayList<Person>();
    Person p1 = new Person("A", Person.FM, 10);
    Person p2 = new Person("B", Person.M, 20);
    Person p3 = new Person("C", Person.FM, 25);
    Person p4 = new Person("D", Person.M, 30);
    Person p5 = new Person("E", Person.FM, 40);
    Person p6 = new Person("F", Person.M, 50);
    persons.add(p1);
    persons.add(p2);
    persons.add(p3);
    persons.add(p4);
    persons.add(p5);
    persons.add(p6);
    //筛选出男性Person
    List<Person> malePerson = (List<Person>) CollectionUtils.select(persons, malePredicate);
    Assert.assertEquals(3, malePerson.size());
    //筛选出年龄大于20的Person
    List<Person> orderThan20Person = (List<Person>) CollectionUtils.select(persons, ageGreateThan20Predicate);
    Assert.assertEquals(4, orderThan20Person.size());
    //筛选出年龄大于20的男性Person
    AndPredicate<Person> condition1 = new AndPredicate<Person>(malePredicate, ageGreateThan20Predicate);
    List<Person> condition1Person = (List<Person>) CollectionUtils.select(persons, condition1);
    Assert.assertEquals(2, condition1Person.size());
}

使用该方法可以简化代码量,同时对于复合条件筛选处理更加方便灵活。

相关文章推荐

maven使用mvn命令创建项目异常java.lang.NoClassDefFoundError: org/apache/commons/collections/ExtendedProperties

命令:mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-gri zzly2 -DarchetypeGroupId=org.g...

关于用集合的remove方法删除list集合中满足条件的元素问题

循环集合的方法有三种: 简单for循环 iterator循环 增强for循环 例子如下: List fList = new ArrayList(); fList...

在用StrutsMenu时,报异常java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LinkedMap

在用Struts Menu时,项目启动时报如下异常:java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LinkedM...

java.lang.ClassNotFoundException: org.apache.commons.collections.map.ListOrderedMap

错误声明: java.lang.ClassNotFoundException: org.apache.commons.collections.map.ListOrderedMap at org.ap...

解决org.apache.commons.collections找不到问题

出现The import org.apache.commons.collections cannot be resolved问题,是因为collections-generic-4.0.1.jar没有引...
  • sanqima
  • sanqima
  • 2015年12月18日 11:36
  • 3994

java.lang.ClassNotFoundException: org.apache.commons.collections.FastHashMap

参考文章:http://zhidao.baidu.com/link?url=ubYbPI8FJp3mNrxDCLApx5IBRqJnkmMsrw6xBNeCrzr0qq95p4UgGVAs2mCYAD...
  • friendan
  • friendan
  • 2014年02月26日 11:29
  • 21307

Bag集合工具类(apache-commons-collections3.2工具包)在java中的使用

 Bag 是在 org.apache.commons.collections 包中定义的接口 ,也是集合的一种扩充工具类,当然结合用JDK中的map类进行相应的逻辑处理,也能实现Bag类的功能,...

一个关于数组中满足条件的元素选择、及函数变换得c语言函数

函数ReadDat()的功能是实现从文件ENG65.IN中读取一篇英文文章,存入到字符串数组xx中;请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,仍存入数组xx...

一个关于数组中满足条件的元素选择、及再次排序得c语言函数。

已知数据文件IN27.DAT中存有200个4位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsVal(),其功能是:把千位数字和十位数字重新组合成一个新的十位数ab(新十位...

[编程之美2.12]快速寻找满足条件的两个数及leetcode的3 sum closest 和 4 sum解析

题目:能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。 例如有如下两个数组:5,6,1,4,7,9,8,给定sum ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在集合中筛选出满足条件的元素——org.apache.commons.collections4的使用
举报原因:
原因补充:

(最多只允许输入30个字)