Q: 表达式引擎把字符串转换为小写的一个例子?

A1: springex

在Java中,你可以使用一些库来实现表达式引擎,比如Apache Commons JEXL、Spring的Expression Language(SpEL)或者使用JavaScript引擎(例如Rhino或Nashorn)。在这里,我将使用Spring的Expression Language(SpEL)作为例子。

首先,确保你的项目中包含了Spring相关的依赖。然后,你可以使用StandardEvaluationContext类来设置输入变量,并通过ExpressionParserExpression来进行表达式的解析和计算。

以下是一个简单的例子,演示如何将输入的字符串转为小写:

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import org.springframework.expression.Expression; import org.springframework.expression.ExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.support.StandardEvaluationContext; public class ExpressionEngineExample { public static void main(String[] args) { // 创建表达式解析器 ExpressionParser parser = new SpelExpressionParser(); // 创建表达式 Expression expression = parser.parseExpression("#inputString.toLowerCase()"); // 创建EvaluationContext,并设置变量 StandardEvaluationContext context = new StandardEvaluationContext(); context.setVariable("inputString", "Hello World"); // 计算表达式 String result = expression.getValue(context, String.class); // 输出结果 System.out.println("Original String: Hello World"); System.out.println("Result after conversion to lowercase: " + result); } }

在这个例子中,我们使用了SpEL表达式 #inputString.toLowerCase() 来将输入字符串转为小写。

StandardEvaluationContext中,我们设置了变量 inputString 的值为 “Hello World”,然后通过 expression.getValue() 方法计算表达式的值。

请注意,为了运行这个例子,你需要在项目中包含Spring相关的库。如果你使用Maven,可以在 pom.xml 文件中添加以下依赖:

  [xml]
1
2
3
4
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>

确保你的项目中包含了这个依赖,然后你就可以运行这个例子了。

A2-Aviator 的例子呢?

Aviator 是一个轻量级的、快速的Java表达式求值引擎,可以用于在运行时动态计算表达式的值。以下是一个简单的例子,演示如何使用 Aviator 将字符串转为小写:

首先,确保你的项目中包含了 Aviator 的依赖。

如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:

  [xml]
1
2
3
4
5
<dependency> <groupId>com.googlecode.aviator</groupId> <artifactId>aviator</artifactId> <version>5.4.1</version> <!-- 查看最新的版本号 --> </dependency>

然后,你可以使用 Aviator 执行表达式。以下是一个例子:

  [java]
1
2
3
Map<String, Object> context = new HashMap<String, Object>(); context.put("text", "I Love Express"); Object value = ExpressionHelper.execute("string.toLowerCase(text)", context);

问题

实际上这个例子会报错。

  [plaintext]
1
com.googlecode.aviator.exception.FunctionNotFoundException: Function not found: string.toLowerCase

因为没有内置大小写的方法。

我们后面会解决这个问题。

avatar 如何真正的实现 string.toLowerCase?

思路

avatar 非常灵活的一点在于支持我们自定义。

自定义

  [java]
1
2
3
4
5
6
7
8
9
10
11
12
13
public class StringToLowerCaseFunction extends AbstractFunction { @Override public String getName() { return "string.toLowerCase"; } public AviatorObject call(Map<String, Object> env, AviatorObject arg1) { String value = FunctionUtils.getStringValue(arg1, env); return new AviatorString(value.toLowerCase()); } }

注册

  [java]
1
2
// 注册 string.toLowerCase() 函数 AviatorEvaluator.addFunction(new StringToLowerCaseFunction());

测试

  [java]
1
2
3
4
Map<String, Object> context = new HashMap<String, Object>(); context.put("text", "I Love Express"); Object value = ExpressionHelper.execute("string.toLowerCase(text)", context); Assert.assertEquals("i love express", value.toString());

参考资料

chat

[Java表达式引擎选型调研分析 京东云技术团队](https://zhuanlan.kanxue.com/article-24953.htm)

表达式引擎工具

Aviator——轻量级Java表达式求值引擎