gpt4 book ai didi

java - Spring 表达式语言 (SpEL) 中的 Elvis 运算符

转载 作者:行者123 更新时间:2023-11-30 04:57:31 28 4
gpt4 key购买 nike

6.5.14 The Elvis Operator

我在 SpEL 中使用 elvis 运算符时发现一些奇怪的行为。如果我没有将 elvis 表达式括在方括号“()”中,则返回 elvis 运算符的结果,并忽略表达式的其余部分。显示以下行为的示例代码:

    HashMap<String, String> facts = new HashMap<String, String>();
facts.put("flag", "flagvalue");
String expressionString;
Expression expression;
Object expressionResult;

expressionString = "[flag]?:'' matches '(?i)flagvalue'";
expression = new SpelExpressionParser().parseExpression(expressionString);
expressionResult = expression.getValue(facts);
System.out.println("Unexpected Result:" + expressionResult);

expressionString = "([flag]?:'') matches '(?i)flagvalue'";
expression = new SpelExpressionParser().parseExpression(expressionString);
expressionResult = expression.getValue(facts);
System.out.println("Expected Result:" + expressionResult);

输出:

    Unexpected Result:flagvalue
Expected Result:true

奇怪的是,当值不在 HashMap 中(即注释facts.put行)时,elvis运算符似乎工作正常,并且两个表达式都按预期返回 false。

(使用 spring-framework-3.0.5)

最佳答案

我认为您需要将示例扩展到 Java 表达式才能理解其中的差异,如下所示:

System.out.println(facts.containsKey("flag") ? facts.get("flag") : "".matches("(?i)flagvalue"))
System.out.println((facts.containsKey("flag") ? facts.get("flag") : "").matches("(?i)flagvalue"))

打印内容

flagvalue
true

我还没有看过内部实现,但我猜 '' 匹配 '(?i)flagvalue' 首先会被评估,因为 matches是表达式 TreeView 中的嵌套运算符。

希望这有帮助。

关于java - Spring 表达式语言 (SpEL) 中的 Elvis 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8063546/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com