3

我有一个方法应该将一个值与一个值列表进行比较。

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

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

2)番石榴谓词是否仅用于过滤而不是布尔函数实现?

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

谢谢。

4

3 回答 3

7

假设您要测试给定集合的所有元素是否满足某些条件,这是一个使用 guava 的示例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)));
}

但是除非您可以重用该谓词,否则您应该考虑使用 guava wiki 建议的非功能版本,例如:

public static boolean allLessThan(Collection<Integer> numbers, Integer value) {
   for (Integer each : numbers) {
      if (each >= value) {
         return false;
      }
   }
   return true;
}
于 2013-10-11T18:23:47.103 回答
3

简而言之,谓词之间的区别是:

  • apache-commons: 不是通用的;
  • guava: 是通用的;
  • javax.sql.rowset: 与RowSets 一起使用(用于过滤 SQL 请求结果)。

我相信你Comparable不想Predicate

于 2013-10-11T18:00:43.177 回答
3

我认为 Errandir 解决了您问题的核心:谓词是从输入到布尔值的函数,并且您想要进行三态比较。

不过,要回答您的其他问题:

Guava 谓词是否仅用于过滤而不是布尔函数实现?

不。番石榴谓词是一个返回布尔值的函数。您可以根据某种过滤来表达由谓词解决的大多数问题,但它们可以在没有任何被过滤的集合的情况下使用。

我可以获得谓词的示例吗?

这是一个使用独立于集合的谓词:

Predicate<Person> isAuthorizedToBuyAlcohol = new Predicate<Person>() {
  public boolean apply(Person person) {
    return person.age() >= LEGAL_LIMIT;
  }
};
于 2013-10-11T18:14:23.620 回答