変数

#variableName 構文を使用して、式内の変数を参照できます。変数は、EvaluationContext 実装の setVariable() メソッドを使用して設定されます。

変数名は、文字 (以下に定義)、アンダースコア、ドル記号で始まる必要があります。

変数名は、次のサポートされている種類の文字の 1 つ以上で構成されている必要があります。

  • 手紙: java.lang.Character.isLetter(char) が true を返す任意の文字

    • これには、A から Za から z ü ñ é  などの文字だけでなく、中国語、日本語、キリル文字などの他の文字セットの文字も含まれます。

  • 桁: 0 から 9

  • 下線: _

  • ドル記号: $

EvaluationContext で変数またはルートコンテキストオブジェクトを設定する場合、変数またはルートコンテキストオブジェクトの型を public にすることをお勧めします。

そうしないと、非パブリック型の変数またはルートコンテキストオブジェクトを含む特定の種類の SpEL 式が評価またはコンパイルに失敗する可能性があります。

変数は評価コンテキストの関数と共通の名前空間を共有するため、変数名と関数名が重複しないように注意する必要があります。

次の例は、変数の使用方法を示しています。

  • Java

  • Kotlin

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"
val tesla = Inventor("Nikola Tesla", "Serbian")

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

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

#this および #root 変数

#this 変数は常に定義され、現在の評価オブジェクトを参照します (これに対して非修飾参照が解決されます)。#root 変数は常に定義され、ルートコンテキストオブジェクトを参照します。#this は式のコンポーネントが評価されるにつれて変化する可能性がありますが、#root は常にルートを参照します。

次の例は、#this 変数をコレクション選択と組み合わせて使用する方法を示しています。

  • Java

  • Kotlin

// 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);
// Create a list of prime integers.
val primes = listOf(2, 3, 5, 7, 11, 13, 17)

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

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

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

次の例は、#this 変数と #root 変数をコレクション射影と組み合わせて使用する方法を示しています。

  • Java

  • Kotlin

// 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);
// Create parser and evaluation context.
val parser = SpelExpressionParser()
val context = SimpleEvaluationContext.forReadWriteDataBinding().build()

// Create an inventor to use as the root context object.
val tesla = 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 !{...}).
val 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."
val results = parser.parseExpression(expression)
		.getValue(context, tesla, List::class.java)