跳到主要内容
版本:7.0.3

变量

Hunyuan 7b 中英对照 Variables

你可以通过使用#variableName语法在表达式中引用变量。变量是通过在EvaluationContext实现中使用setVariable()方法来设置的。

备注

变量名必须以字母(如下所定义)、下划线或美元符号开始。

变量名必须由以下一种或多种支持的字符类型组成。

  • 字母:任何满足 java.lang.Character.isLetter(char) 返回 true 的字符

    • 这包括从 AZazüñé 等字母,以及来自其他字符集(如中文、日文、西里尔文等)的字母。
  • 数字:09

  • 下划线: _

  • 美元符号: $

提示

EvaluationContext中设置变量或根上下文对象时,建议将该变量或根上下文对象的类型设置为public

否则,某些涉及非public类型变量或根上下文对象的SpEL表达式可能无法评估或编译。

注意

由于变量在求值上下文中与函数共享相同的命名空间,因此必须小心确保变量名和函数名不会重叠。

以下示例展示了如何使用变量。

Inventor tesla = new Inventor("Nikola Tesla", "Serbian");

EvaluationContext context = SimpleEvaluationContext.forReadWriteDataBinding().build();
context.setVariable("newName", "Mike Tesla");

parser.parseExpression("name = #newName").getValue(context, tesla);
System.out.println(tesla.getName()); // "Mike Tesla"

#this#root 变量

#this 变量始终是定义好的,它指的是当前的求值对象(未经限定的引用都是针对该对象进行解析的)。#root 变量也始终是定义好的,它指的是根上下文对象。尽管在表达式的各个部分被求值的过程中 #this 的值可能会发生变化,但 #root 始终指向的是根对象。

以下示例展示了如何将#this变量与集合选择结合使用。

// Create a list of prime integers.
List<Integer> primes = List.of(2, 3, 5, 7, 11, 13, 17);

// Create parser and set variable 'primes' as the list of integers.
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadWriteDataBinding().build();
context.setVariable("primes", primes);

// Select all prime numbers > 10 from the list (using selection ?{...}).
String expression = "#primes.?[#this > 10]";

// Evaluates to a list containing [11, 13, 17].
List<Integer> primesGreaterThanTen =
parser.parseExpression(expression).getValue(context, List.class);

以下示例展示了如何将#this#root变量与集合投影结合使用。

// Create parser and evaluation context.
ExpressionParser parser = new SpelExpressionParser();
EvaluationContext context = SimpleEvaluationContext.forReadWriteDataBinding().build();

// Create an inventor to use as the root context object.
Inventor tesla = new Inventor("Nikola Tesla");
tesla.setInventions("Telephone repeater", "Tesla coil transformer");

// Iterate over all inventions of the Inventor referenced as the #root
// object, and generate a list of strings whose contents take the form
// "<inventor's name> invented the <invention>." (using projection !{...}).
String expression = "#root.inventions.![#root.name + ' invented the ' + #this + '.']";

// Evaluates to a list containing:
// "Nikola Tesla invented the Telephone repeater."
// "Nikola Tesla invented the Tesla coil transformer."
List<String> results = parser.parseExpression(expression)
.getValue(context, tesla, List.class);