Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中动态构造谓词_Java_Json_Api_Filtering_Predicate - Fatal编程技术网

如何在Java中动态构造谓词

如何在Java中动态构造谓词,java,json,api,filtering,predicate,Java,Json,Api,Filtering,Predicate,我不确定这是否可行,经过大量研究后,我来到这里寻求您的帮助甚至指导。 假设我有一个json数组,数组中有10种不同类型的对象。这是一个json,通过体育游戏的API检索。 我需要做的是在我的应用程序中过滤这些对象。我正在使用JAVA,到目前为止,我将使用流过滤器和谓词。我知道我可以创建不同类型的谓词并将它们放在stream.filter()函数中,但是否可以以某种方式动态执行 例如,我需要按时间过滤这个数组。这个谓词将是 返回p->p.getTime()>1 然后: 返回match.stream

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

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

返回p->p.getTime()>1

然后:

返回match.stream().filter(谓词).collect(收集器.toList())

如果另一个筛选器具有另一个条件,即团队名称,该怎么办。是否可以在另一个谓词中添加一些how,并在这两者之间添加“and”“OR”条件?我需要使用一个带不同谓词的过滤器函数动态地完成这项工作

有没有一种方法可以像定制查询一样将其存储在数据库中并检索它,然后像谓词一样使用它?或者谓词本身是否可以存储在数据库中


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

这是一个有趣的问题。我认为考虑到数据湖的情况,这种情况也不少见

我认为,正如上面一条评论所建议的,应用的方法是使用
谓词
。您可能有一个谓词,将条件应用为
,然后将其提供给流处理器。这样(假设您有一个基类
Data
,您已将API输出映射到该基类):

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

有没有一种方法可以像定制查询一样将其存储在数据库中并检索它,然后像谓词一样使用它?或者谓词本身是否可以存储在数据库中


您可以在
谓词本身中执行此操作。也就是说,您可以进行数据库调用来获取Java代码,而不是像上面所示编写逻辑。但是,您必须使用
JavaCompiler
进行动态编译。这可能有点复杂。但是,您可以考虑像这样的基于JVM的脚本语言,如Groovy。

在<代码>谓词< /代码> s上有一个<代码>和<代码>方法,它返回一个新的组合代码。您可以先将它们(动态地)组合成一个过滤器,从而构建您在过滤器中使用的过滤器。您的问题并发布一个示例JSON字符串以及您希望从该字符串中获取的
列表。您的意思是像
谓词#和
谓词#或
(这两种方法都是有效的静态方法)?我不明白为什么会被否决。我是新来的。不知道如何表达它不是很正常吗?或者编程中存在着什么?无论如何我不需要显示代码。我需要一个理论来寻找更好的方向。我不需要规范,这就是为什么我不显示任何JSON或任何代码。考虑一个来自dB的过滤器,当让过滤器基于该过滤器构造谓词时,谢谢你的回答。我的项目一直处于搁置状态,所以我没有查看论坛。我将不得不检查它,但有了这个解决方案,我想我可能会找到一种方法来做到这一点。非常感谢。
/* 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());
stream.filter(...).filter(...)...