1

6.5.14 猫王算子

我在 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 中时(即注释 fact.put 行),elvis 运算符似乎工作正常,并且两个表达式都按预期返回 false。

(使用spring-framework-3.0.5)

4

1 回答 1

2

我认为您需要将示例扩展到 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

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

希望这可以帮助。

于 2012-03-14T22:39:26.023 回答