簡體   English   中英

如何在 Java 中動態構造謂詞

[英]How to construct predicates dynamically in Java

我不確定這是否可能,經過大量研究后,我最終來到這里尋求您的幫助甚至指導。 所以,假設我有一個 json 數組,該數組中有 10 種不同類型的對象。 這是一個 json,正在通過帶有體育游戲的 API 檢索。 我需要做的是在我的應用程序中過濾這些對象。 我正在使用 JAVA 到目前為止,我最終將使用 stream 過濾器和謂詞。 我知道我可以創建不同類型的謂詞並將它們放在 stream.filter() function 中,但是可以以某種方式動態地做到這一點嗎?

例如,我需要按時間過濾這個數組。 這個謂詞將是

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

接着:

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

如果另一個過濾器有另一個條件是團隊名稱怎么辦。 是否可以添加一些其他謂詞的方式,並在這兩者之間添加“AND”“OR”條件? 我需要使用具有不同謂詞的一個過濾器 function 動態地執行此操作。

有沒有辦法制作自定義查詢之類的東西來將其存儲在數據庫中並檢索它並像謂詞一樣使用它? 或者謂詞本身是否可以存儲在數據庫中?

如果我對此完全錯誤,請指導我找到另一種方法來做到這一點。 否則將不勝感激。 謝謝大家,祝大家新年快樂。 :)

這是一個有趣的問題。 而且我認為考慮到數據湖場景,這也不會是罕見的面孔。

我認為,正如上面評論中所建議的,申請的方法是擁有一個Predicate 您可能有一個謂詞將條件應用為ANDOR ,然后將其提供給 stream 處理器。 像這樣(假設您有一個基本的 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()調用與在 stream 處理器上一個接一個地調用.filter()相同。 像這樣的東西:

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

因此,您將能夠在for循環中構造這樣的 stream 調用。

有沒有辦法制作自定義查詢之類的東西來將其存儲在數據庫中並檢索它並像謂詞一樣使用它? 或者謂詞本身是否可以存儲在數據庫中?

您可以在Predicate本身內執行此操作。 也就是說,您可以進行數據庫調用以獲取 Java 代碼,而不是編寫如上所示的邏輯。 但是,您必須使用JavaCompiler進行動態編譯。 這可能有點復雜。 但是,您可以考慮使用基於 JVM 的腳本語言,例如 Groovy 來處理此類事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM