如何在 Java 中动态构造谓词

How to construct predicates dynamically in Java

我不确定这是否可行,经过大量研究后,我最终来到这里寻求您的帮助甚至指导。 所以,假设我有一个 json 数组,数组中有 10 种不同类型的对象。这是一个 json 正在通过 API 与体育游戏检索。 我需要做的是在我的应用程序中过滤这些对象。我正在使用 JAVA ,到目前为止我已经结束了我将使用流过滤器和谓词。我知道我可以创建不同类型的谓词并将它们放入 stream.filter() 函数中,但是是否可以动态地以某种方式进行?

比如我需要按时间过滤这个数组。这个谓词将是

return p -> p.getTime() > 1;

然后:

return match.stream().filter( predicate ).collect(Collectors.<Match>toList());

如果另一个过滤器有另一个条件是团队名称怎么办。是否可以添加一些其他谓词以及在这两者之间添加“AND”“OR”条件?我需要使用一个具有不同谓词的过滤器函数动态地执行此操作。

有没有办法制作类似于自定义查询的东西,将其存储在数据库中并检索它并像谓词一样使用它?或者谓词本身是否可以存储在数据库中?

如果我在这方面完全错了,请指导我找到另一种方法来做到这一点。否则将不胜感激。谢谢大家,祝大家新年快乐。 :)

这是一个有趣的问题。而且我认为考虑到数据湖场景,这也不会是罕见的面孔。

我认为,正如上面评论中所建议的那样,申请的方式是获得Predicate。您可能有一个谓词将条件应用为 ANDOR,然后将其提供给流处理器。像这样(假设你有一个基础 class Data 映射到你的 API 输出:

/* Create the predicate with the conditions. Showing 2 here with an "AND" combination. */
Predicate<? extends Data> p = d -> d.getTime() > 1;
p.and( d -> d.getName().equals( "Football" ) ); //Consider ".or()" here, if that is what you need.

/* Supply this predicate to the stream processor. */
match.stream().filter( p ).collect(Collectors.<Match>toList());

使用and()调用与在流处理器上一个接一个地调用.filter()是一样的。像这样:

stream.filter(...).filter(...)...

因此,您将能够在 for 循环中构建这样的流调用。

Is there a way to make something like a custom query to store it in a database and retrieve it and use it like a predicate? Or the predicate itself is it possible to be stored in a database?

您可以在自己的 Predicate 中执行此操作。也就是说,您可以调用数据库来获取 Java 代码,而不是编写如上所示的逻辑。但是,您将不得不使用 JavaCompiler 进行动态编译。这可能有点复杂。但是,您可以考虑使用基于 JVM 的脚本语言,例如 Groovy 来处理这些事情。