在Java中使用Predicate进行比较

时间:2013-10-11 17:31:36

标签: java guava

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

比较功能可以小于,大于或等于。我遇到了这个Predicate概念,我想在这种情况下理解并实施。 以下是我的几个问题。

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

2)Guava谓词只是意味着做过滤而不是说布尔函数实现吗?

3)我能为谓词得到一个例子吗?

感谢。

3 个答案:

答案 0 :(得分:6)

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

但除非您可以重用该谓词,否则您应该考虑番石榴维基建议的非功能版本,例如: :

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

答案 1 :(得分:3)

简而言之,Predicates之间的差异是:

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

我认为您希望Comparable不是Predicate

答案 2 :(得分:3)

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

回答你的其他问题:

  

Guava谓词是否仅仅意味着进行过滤而不是说布尔函数实现?

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

  

我可以获得Predicate的示例吗?

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

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