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

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


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


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


例如:


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.


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


眼眸繁星
浏览 97回答 2
2回答

jeck猫

过滤在排序之前进行。比较器的顺序很重要。Comparator#thenComparing按照用户指定的顺序查看复合比较器。谓词的顺序无关紧要(除非它们是有状态的或依赖于其他谓词,必须避免这种情况)。Predicate#and以任何顺序查看复合谓词。

catspeake

如果您的谓词是无状态的并且不修改它们测试的对象,那么它们是关系代数方面的选择。因此,它们的顺序对最终结果无关紧要。但是,性能可能存在差异。通常建议首先应用快速和高度选择性的谓词。筛选后排序也会更快。另一方面,根据您所做的事情,这些好处可能微不足道。在这种情况下,您应该选择使您的代码最容易理解和维护的顺序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java