2013-10-11 49 views
1

我有一种方法应该将值与值列表进行比较。在Java中使用谓词进行比较

比较函数可以小于,大于或等于。我遇到了这个我试图在这种情况下理解和实现的这个概念Predicate。 以下是我的几个问题。

1)在apache commons,guava和javax.sql中定义了Predicate类。他们之间有什么区别? (我尝试通过文档,但无法得到它)

2)是番石榴谓词只意味着做过滤,而不是说布尔函数implementationaion?

3)我可以得到一个Predicate的例子吗?

谢谢。

+4

我要给你的假设,你,你打完它 – Cruncher

+0

番石榴有一个'Predicate'接口之前提交这个疑点利益,但它是为过滤。 –

+0

@SotiriosDelimanolis您可以使用(C++风格)谓词实现一个比较器,其中假定谓词在if

回答

6

假设你想测试一个给定的集合中的所有元素是否满足一些条件,这是番石榴的Predicate(一个例子@ ColinD的评论指向财富涉及Comparable已有谓词):

public static class LessThan<T extends Comparable<T>> implements Predicate<T> { 
    private final Comparable<T> value; 

    public LessThan(final Comparable<T> value) { 
    this.value = value; 
    } 

    @Override 
    public boolean apply(final T input) { 
    return value.compareTo(input) > 0; 
    } 
} 

public static void main(final String[] args) { 
    final Collection<Integer> things = Arrays.asList(1, 2, 3, 4); 
    System.out.println(Iterables.all(things, new LessThan<Integer>(5))); 
} 

但除非你可以重复使用谓词,你应该利弊像番石榴维基建议的那样,可以是非功能性版本。:

public static boolean allLessThan(Collection<Integer> numbers, Integer value) { 
    for (Integer each : numbers) { 
     if (each >= value) { 
     return false; 
     } 
    } 
    return true; 
} 
+0

谢谢......我可以使用Iterables.any方法并将它传递给一个集合以及一个可以完成我的工作的谓词。这是合乎逻辑的吗? – LPD

+0

取决于你想达到什么?回到我的示例'LessThan'谓词 - 如果通过any()过滤集合,它将返回true,如果集合中至少有一个元素满足谓词,即小于设置值。请参阅[guava文档](http://code.google.com/p/guava-libraries/wiki/FunctionalExplained)了解更多选项。 – Pyranja

+1

仅供参考,您的'LessThan'谓词相当于[Range.lessThan(C)](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Range.html#每种不超过(C))。 – ColinD

3

总之,谓词之间的差异是:

  • apache-commons:是不通用的;
  • guava:是通用的;使用RowSet s(用于过滤SQL请求结果)。

我相信你想ComparablePredicate

3

我认为Errandir得到了你的问题的核心:谓词是从它的输入到布尔值的函数,并且你想做三态比较。

虽则回答您的其他问题:

是番石榴谓词只是为了做过滤,而不是说一个布尔函数实现?

不是。Guava谓词是一个返回布尔值的函数。 您可以通过某种过滤术语解释谓词所解决的大多数问题,但可以在没有任何正在过滤的集合的情况下使用它们。

我可以得到一个Predicate的例子吗?

下面是有一个谓语采用独立的集合:

Predicate<Person> isAuthorizedToBuyAlcohol = new Predicate<Person>() { 
    public boolean apply(Person person) { 
    return person.age() >= LEGAL_LIMIT; 
    } 
}; 
+0

我可以使用'Iterables.any'方法并通过它一个集合以及一个做我的工作的谓词。这是合乎逻辑的吗? – LPD

+0

@LPD,是的。这是检查集合是否包含满足约束条件的一种方法。 –