Hãy nói rằng chúng ta có đoạn mã sau đây, mà điền vào một danh sách với một số số nguyên tố và định nghĩa nó như là một biến trong một bối cảnh SpEL:
// create an array of integers
List<Integer> primes = new ArrayList<Integer>();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));
// create parser and set variable 'primes' as the array of integers
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext ctx = new StandardEvaluationContext();
ctx.setVariable("primes", primes);
Bây giờ, nếu chúng ta muốn thu hẹp danh sách và nhận được tất cả các số nguyên tố> 10, chúng tôi có thể sử dụng toán tử lựa chọn ?[]
. Tuyên bố sẽ là câu trả lời này:
Expression expression = parser.parseExpression("#primes.?[#this>10]");
List<Integer> primesGreaterThanTen = (List<Integer>) expression.getValue(ctx);
Như bạn có thể thấy, biểu thức cần đánh giá là #primes.?[#this > 10]
. Làm thế nào nó hoạt động ?
#primes
đề cập đến danh sách primes
.
- Toán tử lựa chọn
?[]
khớp với mọi đối tượng i
trong danh sách primes
mà không phải là rỗng và khớp với tiêu chí được đưa ra trong dấu ngoặc đơn. Trong ví dụ của chúng tôi, tiêu chí là #this > 10
. #this
dùng để chỉ đối tượng đánh giá hiện tại, trong ví dụ của chúng tôi sẽ là đối tượng từ danh sách đang được kiểm tra tại thời điểm này cho không-null và> 10.
Kết quả từ việc đánh giá sẽ là một danh sách, bao gồm:
[11, 13, 17]
Một SpEL bối cảnh có thể có một biến #root
. Chúng ta hãy có lớp đơn giản này:
public class SomeCustomObject {
public int stringLength(String input) {
if (input == null) return 0;
return input.length();
}
}
và xác định một thể hiện của SomeCustomObject
của chúng tôi là biến #root
.
SomeCustomObject someObject = new SomeCustomObject();
context.setRootObject(someObject);
Điều này sẽ tạo đối tượng gốc cho ngữ cảnh SpEL.
Ví dụ đơn giản với biến số #root
.
String name = "kocko";
ctx.setVariable("name", kocko);
String statement = "#root.stringLength(#kocko) == 5";
Expression expression = parser.parseExpression(statement);
boolean result = expression.getValue(context, Boolean.class);
Biến số result
sẽ được đánh giá là true
.
Sức mạnh của #root
là gì?
Thông qua một đối tượng gốc đơn lẻ, bạn có thể hiển thị môi trường tùy chỉnh toàn diện cho các biểu thức của mình, ví dụ phương thức và/hoặc biến số tiện ích tùy chỉnh. Thông tin
thêm: