当前位置: 首页 > 面试题库 >

将简单的表达语言放入Java

周和歌
2023-03-14
问题内容

在我的Java应用程序中,用户可以指定如何从一系列元数据字段中命名其文件。即

%artist% - %album% - %disctotal%

然后,我的代码解析这些字段,并相应地重命名文件。但我希望用户能够使用“表达式语言”,以便他们能够说出类似以下内容:

$if(%disctotal% >= 01,%discno%)

使用ifelse,比较长度和大小写等。

我不想从头开始编写此代码,有什么可以为我提供这些代码的插件吗?

编辑:我认为我收到了一些好评,但我的知识让我失望。让我们简化我希望用户能够写的问题

$ if(%disctotal%> = 01,%discno%)

进入gui中的字段。

然后,在我的Java代码中,我希望能够将此表达式应用于一组文件,因此对于每个文件,我具有disctotal和discno的值,但是我希望能够将该表达式转换为类似

if(discTotal> = 1){返回discNo} else {返回“”}

我不想做的是必须编写可识别字符串的代码(“ $ if(%disctotal%> = 01,%discno%)”是一个if语句,因为这样做很笨拙。

然后对此进行扩展,我希望该表达式允许诸如大写oof字段,检查字段长度等内容。

或者:也许应该这样,用户输入表达式,然后在以后的每个文件中,Java代码用实际值替换每个变量

即$ if(%disctotal%> = 01,%discno%)-> $ if(2> = 01,1)

然后将其传递给表达语言进行解析并给出结果,

这是Javascript的主意吗?


问题答案:

如何使用Java
1.6随附
的JavaScript引擎呢?

您可以看到如何传递所有参数:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.put("artist", artist);
...

您将使用读取回值

ScriptEngine.get(...)

粘合的最后一点是用函数声明包围用户的表达式,并编写一个调用函数并将结果分配给众所周知的变量的表达式。

因此,开始实验,让我们有一个功能来测试表达式:

private static void printResult(final ScriptEngine jsEngine, String name, String expr) throws ScriptException {
    Object result = jsEngine.eval(expr);
    System.out.println(name + " result: " + result + "; expr: " + expr);
}

现在让我们称之为:

public static void main(String[] args) throws Exception {
    ScriptEngineManager sem = new ScriptEngineManager();
    ScriptEngine jsEngine = sem.getEngineByName("JavaScript");
    printResult(jsEngine, "Hello World", "'Hello World'");
    printResult(jsEngine, "Simple Math", "123 + 456");
}

这将产生:

Hello World result: Hello World; expr: 'Hello World'
Simple Math result: 579.0; expr: 123 + 456

现在让我们尝试一下您的用例:

public static void main(String[] args) throws Exception {
    ScriptEngineManager sem = new ScriptEngineManager();
    ScriptEngine jsEngine = sem.getEngineByName("JavaScript");

    String expr = "artist + '-' + album + (disktotal > 1 ? ('-D' + diskno) : '')";

    jsEngine.put("artist", "U2");
    jsEngine.put("album", "The Joshua Tree");
    jsEngine.put("disktotal", 1);
    jsEngine.put("diskno", 1);
    printResult(jsEngine, "Single Disk", expr);

    jsEngine.put("artist", "Tori Amos");
    jsEngine.put("album", "To Venus and Back");
    jsEngine.put("disktotal", 2);
    jsEngine.put("diskno", 2);
    printResult(jsEngine, "Muti-Disk", expr);
}

产生结果:

Single Disk result: U2-The Joshua Tree; expr: ...
Muti-Disk result: Tori Amos-To Venus and Back-D2; expr: ...

请注意,托里(Tori)的末尾是“ D2”。



 类似资料:
  • 我在骆驼路线中使用了这个表达: 然而,它对这个符号感到震惊。 如何构造这个表达式,假定它从消息体上POJO的getter获取一个值,并将其压缩到Exchange上的一个属性(加1)。

  • 我将创建一个可以插入并显示到现在的链接: 这是我的初始化函数,只会为第一个

  • JSP表达式语言(EL)使得访问存储在JavaBean中的数据变得非常简单。JSP EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null。 一个简单的语法 典型的,当您需要在JSP标签中指定一个属性值时,只需要简单地使用字符串即可: <jsp:setProperty name="box" propert

  • JSF提供了丰富的表达式语言。 我们可以使用#{operation-expression}表示法编写正常操作。 以下是JSF表达式语言的一些优点。 可以引用bean属性,其中bean可以是存储在请求,会话或应用程序范围中的对象,也可以是托管bean。 提供对集合元素的轻松访问,可以是列表,映射或数组。 提供对预定义对象(如请求)的轻松访问。 算术,逻辑和关系运算可以使用表达式语言完成。 自动类型转

  • 我不熟悉Camel,并且在JavaDSL中使用简单表达式从属性文件中获取值。 <代码>。setProperty(“PortalUrl”,简单(“properties:Portal.url”)) 属性文件值-门户。url=abc。com/示例 但是现在我需要从属性文件中获取客户特定的URL。示例值- <代码>门户。url。客户1=abc。com/example/xiang门户。url。客户2=abc

  • 主要内容:Go语言工程结构简单,Go语言编译速度快Go语言语法简单易懂,学习曲线平缓,不需要像 C/ C++ 语言动辄需要两到三年的学习期。Go语言被称为“互联网时代的C语言”。互联网的短、频、快特性在Go语言中体现得淋漓尽致。一个熟练的开发者只需要短短的一周时间就可以从学习阶段转到开发阶段,并完成一个高并发的服务器开发。 Go语言是 Google 公司开发的一种静态型、编译型并自带垃圾回收和并发的编程语言。所以它是一门类型安全的语言,加上通过构