Java将字符串评估为表达式或代码执行

Lea*_*oop 2 java apache

说,我有具有名称,年龄和薪水属性的Emp对象列表。

List<Emp> empObj = readEmpDetails();
Run Code Online (Sandbox Code Playgroud)

保留来自DB的过滤条件或从平面文件读取。但是语法如下格式。

name contains mike
age gt 100
Run Code Online (Sandbox Code Playgroud)

如何将上述条件列表转换为Java表达式。需要针对我们从数据库源读取的empObj执行此条件。我怎样才能做到这一点 ?请分享您的经验。

i.b*_*nko 5

您可以使用Spring Spelorg.springframework.expression.ExpressionParser):

public static void main(String[] args) {
    List<Emp> emp = Arrays.asList(new Emp("Ann", 25, 1000L)
            ,new Emp("John", 40, 2000L)
            ,new Emp("Alex", 60, 3000L));
    ExpressionParser parser = new SpelExpressionParser();

    Expression exp = parser.parseExpression("age gt 30");


    emp.stream()
            .filter(emp1 -> exp.getValue(emp1, Boolean.class))
            .forEach(emp1 -> System.out.println(emp1.getName() + " " + emp1.getAge()));
}
Run Code Online (Sandbox Code Playgroud)

输出

John 40
Alex 60
Run Code Online (Sandbox Code Playgroud)

文字和操作的类型为:

  • 文字:
    • 文字文字:“一个文字”,“另一个!”,…
    • 数字文字:0、34、3.0、12.3 ...
    • 布尔文字:true,false
    • 空文字:null
    • 文字标记:一个,某些文本,主要…
  • 文字操作:
    • 字符串串联:+
    • 文字替换:|名称为$ {name} |
  • 算术运算:
    • 二进制运算符:+,-,*,/,%
    • 减号(一元运算符):-
  • 布尔运算:
    • 二进制运算符:和,或
    • 布尔取反(一元运算符):!,不
  • 比较和平等:
    • 比较器:>,<,> =,<=(gt,lt,ge,le)
    • 等号运算符:==,!=(等式,ne)
  • 条件运算符:
    • 如果-那么:(如果)?(然后)
    • 如果-然后-其他:(if)?(然后):(其他)
    • 默认值:(值)?:(默认值)