json—如何在java中动态构造 predicate

4si2a6ki  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(512)

我不确定这是否可行,经过大量的研究,我最终来到这里寻求你的帮助甚至指导。假设我有一个json数组,数组中有10种不同类型的对象。这是一个json,通过运动游戏的api检索。我需要做的是在我的应用程序中过滤这些对象。我正在使用java,到目前为止,我将使用流过滤器和 predicate 。我知道我可以创建不同类型的 predicate 并将它们放在stream.filter()函数中,但是是否可以动态地这样做呢?
例如,我需要按时间过滤这个数组。这个 predicate 将是 return p -> p.getTime() > 1; 然后: return match.stream().filter( predicate ).collect(Collectors.<Match>toList()); 如果另一个过滤器有另一个条件,即团队名称,该怎么办。是否可以在另一个 predicate 中添加一些how,并在这两个 predicate 之间添加“and”“or”条件?我需要使用一个带有不同 predicate 的过滤器函数动态地完成这项工作。
有没有一种方法可以像定制查询一样将其存储在数据库中并检索它,然后像 predicate 一样使用它?或者 predicate 本身是否可以存储在数据库中?
如果我在这方面完全错了,请引导我找到另一种方法来做这件事。否则,我们将不胜感激。谢谢大家,祝大家新年快乐。:)

xv8emn3q

xv8emn3q1#

这是一个有趣的问题。我认为考虑到数据湖的情况,这种情况并不少见。
我认为,正如上面的评论所建议的,申请的方法是拥有 Predicate . 您可能有一个 predicate ,将条件应用为 AND 或者 OR 然后提供给流处理器。像这样(假设您有一个基类 Data 已将api输出Map到的对象):

/* 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 循环。
有没有一种方法可以像定制查询一样将其存储在数据库中并检索它,然后像 predicate 一样使用它?或者 predicate 本身是否可以存储在数据库中?
你可以在你的范围内做这件事 Predicate 它自己。也就是说,您可以通过数据库调用来获取java代码,而不是编写如上所示的逻辑。但是,您必须使用 JavaCompiler . 这可能有点复杂。但是,您可以考虑使用基于jvm的脚本语言,比如groovy来实现这些功能。

相关问题