首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流中有"Collectors.toList()“的Collectors.toList解析参数不能作为expressionString工作?

流中有"Collectors.toList()“的Collectors.toList解析参数不能作为expressionString工作?
EN

Stack Overflow用户
提问于 2020-11-08 13:22:51
回答 1查看 358关注 0票数 0

这会起作用的

代码语言:javascript
复制
parser.parseExpression("#configList.stream().toArray()").getValue(context)

但下面的话不会

代码语言:javascript
复制
parser.parseExpression("#configList.stream().map(o -> o.ruleId).collect(Collectors.toList())").getValue(context)

F.Y.I .上下文结构如下:

代码语言:javascript
复制
        Object[] args = joinPoint.getArgs();
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        String[] params = discoverer.getParameterNames(method);
        EvaluationContext context = new StandardEvaluationContext();
        for (int i = 0; i < params.length; i++) {
            context.setVariable(params[i], args[i]);
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-08 17:20:18

尽管Java可以在SPeL表达式中使用,但SPeL本身是一种单独的语言,并不完全支持Java语言。来自文档

SpEL基于一种与技术无关的API,允许在需要时集成其他表达式语言实现。

若要对SPeL表达式中的列表执行筛选和映射操作,请分别使用藏书选择集合投影

集合选择示例

代码语言:javascript
复制
// Java:
configList.stream().filter(o -> o.getRuleId() > 2).collect(Collectors.toList())

// SPeL (notice the question mark) :
"#configList.?[ruleId>2]"

集合投影示例

代码语言:javascript
复制
// Java:
configList.stream().map(o -> o.getRuleId()).collect(Collectors.toList())

// SPeL (notice the exclamation mark) :
"#configList.![ruleId]"

我举了一个小例子来说明这一点:

代码语言:javascript
复制
public class So64738543ExpressionTest {
    public static class RuleItem {
        private int ruleId;

        public RuleItem(int ruleId) {
            this.ruleId = ruleId;
        }

        public int getRuleId() {
            return ruleId;
        }
    }

    @Test
    public void collectionProjection() {
        List<RuleItem> ruleItems = Arrays.asList(new RuleItem(1), new RuleItem(2), new RuleItem(3));
        EvaluationContext context = new StandardEvaluationContext(ruleItems);

        Expression expression = new SpelExpressionParser().parseExpression("#root.![ruleId]");
        Assert.assertEquals(Arrays.asList(1,2,3), expression.getValue(context));
    }
}

编辑

此外,如果SPeL表达式变得越来越复杂,我强烈建议将表达式移动到静态方法并使用T operator调用它。在引用静态方法时,不要忘记包含完全限定的包名。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64738543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档