Read Sean

Read me, read Sean.
posts - 508, comments - 655, trackbacks - 9, articles - 4

[Jakarta Commons笔记] Commons Collections - Predicate组

Posted on 2005-08-06 08:43 laogao 阅读(3400) 评论(4)  编辑  收藏 所属分类: On Java

 

接下来看Predicate

 

Predicate

AndPredicate

OrPredicate

AllPredicate

OnePredicate

NonePredicate

PredicateUtils

 

PredicateCommons Collections中定义的一个接口,可以在org.apache.commons.collections包中找到。其中定义的方法签名如下:

 

public boolean evaluate(Object object)

 

它以一个Object对象为参数,处理后返回一个boolean值,检验某个对象是否满足某个条件。其实这个Predicate以及上一篇笔记提到的Comparator还有我们即将看到的TransformerClosure等都有些类似C/C++中的函数指针,它们都只是提供简单而明确定义的函数功能而已。

 

跟其他组类似,Commons Collections也提供了一组定义好的Predicate类供我们使用,这些类都放在org.apache.commons.collections.functors包中。当然,我们也可以自定义Predicate,只要实现这个Predicate接口即可。在Commons Collections中我们也可以很方便使用的一组预定义复合Predicate,我们提供2个或不定数量个Predicate,然后交给它,它可以帮我们处理额外的逻辑,如AndPredicate处理两个Predicate,只有当两者都返回true它才返回trueAnyPredicate处理多个Predicate,当其中一个满足就返回true,等等。

 

看看具体的代码中如何使用这些Predicate吧:

 

package sean.study.commons.collections;

 

import org.apache.commons.collections.Predicate;

import org.apache.commons.collections.PredicateUtils;

import org.apache.commons.collections.functors.InstanceofPredicate;

import org.apache.commons.collections.functors.NotNullPredicate;

import org.apache.commons.lang.BooleanUtils;

import org.apache.commons.lang.StringUtils;

 

public class PredicateUsage {

 

    public static void main(String[] args) {

        demoPredicates();

    }

   

    public static void demoPredicates() {

        System.out.println(StringUtils.center(" demoPredicates ", 40, "="));

        Predicate p1 = new InstanceofPredicate(String.class);

        Predicate p2 = NotNullPredicate.getInstance();

        Predicate p3 = new Predicate() {

            public boolean evaluate(Object obj) {

                String str = (String) obj;

                return StringUtils.isAlphanumeric(str)

                    && str.length() >= 6

                    && str.length() <= 10;

            }

        };

        Predicate p4 = PredicateUtils.allPredicate(new Predicate[]{p1, p2, p3});                String input = "ABCD1234";

        Object[] raw = new Object[] {

            "Is '",

            input,

            "' a valid input? ",

            BooleanUtils.toStringYesNo(p4.evaluate(input)),

            "."

        };

        System.out.println(StringUtils.join(raw));

        System.out.println(StringUtils.repeat("=", 40));

    }

 

}

 

输出结果如下:

 

============ demoPredicates ============

Is 'ABCD1234' a valid input? yes.

========================================

 

这里面我首先定义了3个简单的Predicatep1判断对象是否为String的实例,p2判断是否对象为nullp3是自定义的,判断是否为数字字母的组合,并且长度在6~10字符。然后我用AllPredicate将它们组合到一起,成为p4,当p1p2p3都满足时,p4evaluate方法才返回true。利用Predicate我们可以把判断truefalse的逻辑从特定的业务代码分离出来,以后我们重用也好,重新组装也好,都是很方便的。

 

Feedback

# re: [Jakarta Commons笔记] Commons Collections - Predicate组  回复  更多评论   

2008-05-16 13:28 by nickevin
好帖永远都不缺乏读者 即使回复不是很多

# re: [Jakarta Commons笔记] Commons Collections - Predicate组[未登录]  回复  更多评论   

2009-02-09 13:39 by 999
好帖永远都不缺乏读者 即使回复不是很多

# re: [Jakarta Commons笔记] Commons Collections - Predicate组  回复  更多评论   

2009-05-08 07:57 by wsguang
感谢感谢

# re: [Jakarta Commons笔记] Commons Collections - Predicate组  回复  更多评论   

2009-06-02 16:58 by 林韵
好帖永远都不缺乏读者 即使回复不是很多

只有注册用户登录后才能发表评论。


网站导航: