使用 SpEL 进行循环和评估
Looping and evaulating with SpEL
首先,请考虑我作为开发人员和 Spring 用户的初学者。
我正在寻找这个问题的解决方案:
有一个给定的列表,其中填充了 JsonNode 对象,称为属性。我必须找到哪个正在根据给定的布尔表达式评估 true 。我想在上下文中注册一个集合,对其进行迭代并查找是否有任何属性使用 SpEl 计算为真,因此我不必每次都创建这个非常昂贵的上下文。
你知道如何更快地完成吗? (代码是假的。问题是真实的。)
//given
List<JsonNode> attributes;
attributes
.stream()
.anyMatch(attribute -> {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("attribute.name == 'John Doe'");
EvaluationContext ctx = new StandardEvaluationContext(attribute);
return exp.getValue(ctx, Boolean.class);
});
感谢您的帮助!
您不需要为每个元素解析和构建上下文;您可以将根对象传递到 getValue()
.
解析一次表达式并使用 getValue(context, attribute, Boolean.class)
代替。
除非您需要自定义上下文,否则您甚至不需要。
getValue(attribute, Boolean.class)
首先,请考虑我作为开发人员和 Spring 用户的初学者。 我正在寻找这个问题的解决方案:
有一个给定的列表,其中填充了 JsonNode 对象,称为属性。我必须找到哪个正在根据给定的布尔表达式评估 true 。我想在上下文中注册一个集合,对其进行迭代并查找是否有任何属性使用 SpEl 计算为真,因此我不必每次都创建这个非常昂贵的上下文。
你知道如何更快地完成吗? (代码是假的。问题是真实的。)
//given
List<JsonNode> attributes;
attributes
.stream()
.anyMatch(attribute -> {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("attribute.name == 'John Doe'");
EvaluationContext ctx = new StandardEvaluationContext(attribute);
return exp.getValue(ctx, Boolean.class);
});
感谢您的帮助!
您不需要为每个元素解析和构建上下文;您可以将根对象传递到 getValue()
.
解析一次表达式并使用 getValue(context, attribute, Boolean.class)
代替。
除非您需要自定义上下文,否则您甚至不需要。
getValue(attribute, Boolean.class)