2016-04-27 49 views
1

這很不幸有點醜。我有一個格式的字符串,作爲約束髮送到數據庫。它看起來是這樣的:如何將字符串邏輯表達式轉換爲java可執行表達式

String constraint = "((attr1 eq 1) OR (attr2 eq 5)) AND (attr3 BETWEEN (1, 5))" 

我需要解析成一個流過濾器這樣的方式,看起來像這樣:

stream.filter(obj -> 
    (obj.getAttr1() == 1 || obj.getAttr2() == 5) && (isBetween(obj.getAttr3(), 1, 5))) 

的isBetween方法是其他地方將決定attr3值是否在1和5之間。有沒有簡單的解析方法?

應該很好,可以有多個過濾器調用,而不是將它們全部合併爲一個。決定GETATTR使用可在沿線的if語句來完成:

if (attr.equals("attr1")) { 
    obj.getAttr1(); 
} 

回答

1

您不妨看看EvalEx。它是一個通用表達式解析器和評估器。

你可以定義你自己的操作符,所以「eq」,「and」和「or」應該不成問題。你可以創建變量,所以「attr1」和朋友也不應該成爲問題。

這個是有可能的問題:

attr3 BETWEEN (1, 5) 

不知道,如果你可以定義一個操作員採取右側多個參數,或返回一個後綴運算符的功能。但源代碼是可用的,所以也許你可以入侵。

相關問題