繁体   English   中英

在Java中使用谓词进行比较

[英]Using Predicate in Java for Comparison

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

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

1)在Apache Commons,guava和javax.sql中定义了Predicate类。 它们之间有什么区别? (我尝试浏览文档,但无法获取)

2)Guava谓词仅是为了进行过滤而没有说布尔函数实现吗?

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

谢谢。

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

简而言之,谓词之间的差异是:

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

我相信您想要Comparable而不是Predicate

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

但是要回答您的其他问题:

Guava谓词仅是为了进行过滤而没有说布尔函数实现吗?

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

我可以举一个谓词示例吗?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM