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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值