应用比较器和谓词的顺序重要吗?

时间:2019-06-24 09:50:31

标签: java sorting filter java-stream

我们有一个网页,用户可以在其中选择任意数量的规则来过滤和排序一组项目。对于每条规则,他都为其设置了优先级,用户可以使用该优先级定义应如何应用规则的顺序。

从这组规则中,我提取了Comparator(如果规则正在排序)和/或Predicates(如果用户想要过滤项目)对象。我想将它们与项目流一起使用,以便对其进行过滤和排序。

我的问题是,应用Comparator和Predicate对象的顺序重要吗?我知道Comparator对象的顺序很重要,但是谓词出现在开头还是结尾有关系吗?

例如:

We have Comparator objects: comparator1, comparator2
We have Predicate objects: predicate1, predicate2

Is there a difference between applying them in the following orders:

- comparator1, comparator2, predicate1, predicate2
- predicate1, predicate2, comparator1, comparator2
- predicate1, comparator1, predicate2, comparator2
- predicate2, comparator1, comparator2, predicate1

Note: comparator1 always appears before comparator2. I am aware that changing their order could result in different results in terms of sorting.

现在,我认为以上所有情况都将导致相同的输出(在排序和项目方面)。这将允许我先应用所有过滤器,然后再进行排序。但是我不确定,所以我不得不在这里问。

2 个答案:

答案 0 :(得分:2)

  1. 在排序之前先进行过滤。
  2. 比较器的顺序很重要。观察Comparator#thenComparing以用户指定的顺序复合比较器。
  3. 谓词的顺序无关紧要(除非它们是有状态的或依赖于其他的,必须避免)。查看Predicate#and以任意顺序复合谓词。

答案 1 :(得分:1)

如果谓词是无状态的,并且不修改它们测试的对象,则它们为selections in terms of relational algebra。因此,它们的顺序无关紧要