不幸的是,这有点难看。我有一个以约束形式发送到数据库的格式编写的字符串。它看起来像这样:
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();
}
您可能希望了解EvalEx。它是一个通用的表达式解析器和计算器。
您可以定义自己的运算符,因此"eq"、"and"one_answers"or"不应该成为问题。您可以创建变量,所以"attr1"和好友也不应该成为问题。
这可能是问题所在:
attr3 BETWEEN (1, 5)
不确定您是否可以定义一个在右侧接受多个参数的运算符,或者一个返回后缀运算符的函数。但是源代码是可用的,所以也许你可以在.