Java:如何使用大量谓词过滤大量对象?

Abd*_*ull 6 java collections predicate

在Java中,我有一大堆对象(~10,000个对象),比方说Set<Person> cityInhabitants.我还有一个大的谓词集合(~1,000个谓词),它们将用于过滤掉任何Person匹配的谓词.例如,谓词可能是

  • person.getName().equals("ugly name1")
  • person.getName().equals("ugly name2")
  • person.getAge() < 18.

此要求需要以下挑战:

  • 过滤应该很快
  • 谓词是"业务定义的",因此添加和删除谓词应该很容易.这意味着谓词可能不应该在源代码中进行硬编码,但最好在数据库中维护(?)

这些挑战有哪些解决方案?有没有可以帮助的图书馆?

Tom*_*ann 2

我建议您按照执行速度的顺序对谓词进行排序。然后,您可以按速度顺序执行谓词,首先使用最快的谓词,通常意味着较慢的谓词将必须在较小的集合上运行。

然而,这个假设并不完全正确,您需要计算出删除的谓词对执行速度的百分比。然后我们可以看到哪个谓词删除的对象百分比最快。然后我们可以按照对我来说最优化的顺序执行谓词。

您可以轻松实现自己的谓词interface

public interface Predicate<T> {

    boolean filter(T object);

}
Run Code Online (Sandbox Code Playgroud)

然后,您需要为每个规则创建谓词对象。您可以创建一些更动态的类来进行年龄和姓名检查,这也将减少您需要的代码量。

public class AgeCheck<T> implements Predicate<T> {

    private final int min;
    private final int max;
    public AgeCheck(int min, int max) {
        this.min = min;
        this.max = max;
    }

    @Override
    public boolean filter(T object) {
        // if( t.age() < max && t.age > min) ...
    }

}
Run Code Online (Sandbox Code Playgroud)