如何在集合中筛选出满足条件的元素——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());
}

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

python-2-1 如何在列表, 字典, 集合中根据条件筛选数据-列表解析-filter

-- coding: utf-8 --”’ 2-1 如何在列表, 字典, 集合中根据条件筛选数据预备知识: 本节中我们会用到randint,lambda,timeit,filter等关键字 通常...
  • u013679490
  • u013679490
  • 2017年01月14日 10:18
  • 2917

【101】java的List中使用filter过滤出符合特定条件的元素List

在实际开发中,经常需要把一个列表中的元素,按照特定条件过滤出来,放到一个新的列表中。本文给出了几个例子,来描述解决这个问题的方法。 我们假设有一个书的List,需要找出其中id分别是3、6、8、9的...
  • zhangchao19890805
  • zhangchao19890805
  • 2016年12月26日 13:41
  • 3651

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

循环集合的方法有三种: 简单for循环 iterator循环 增强for循环 例子如下: List fList = new ArrayList(); fList...
  • sinat_35495823
  • sinat_35495823
  • 2017年03月31日 10:29
  • 1895

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

命令:mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-gri zzly2 -DarchetypeGroupId=org.g...
  • svygh123
  • svygh123
  • 2016年04月28日 10:34
  • 1294

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

循环集合的方法有三种: 简单for循环 iterator循环 增强for循环 例子如下: List fList = new ArrayList(); fList...
  • sinat_35495823
  • sinat_35495823
  • 2017年03月31日 10:29
  • 1895

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

在用Struts Menu时,项目启动时报如下异常:java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LinkedM...
  • Chen_yu_ting
  • Chen_yu_ting
  • 2011年06月23日 18:23
  • 1707

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

错误声明: java.lang.ClassNotFoundException: org.apache.commons.collections.map.ListOrderedMap at org.ap...
  • qq_35367612
  • qq_35367612
  • 2016年10月20日 09:29
  • 376

解决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
  • 5263

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

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

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

 Bag 是在 org.apache.commons.collections 包中定义的接口 ,也是集合的一种扩充工具类,当然结合用JDK中的map类进行相应的逻辑处理,也能实现Bag类的功能,...
  • chenleixing
  • chenleixing
  • 2015年01月25日 21:19
  • 7507
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在集合中筛选出满足条件的元素——org.apache.commons.collections4的使用
举报原因:
原因补充:

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