javascript - 在 Nashorn 中将 javascript 名称设置为 Java 函数

标签 javascript java java-8 nashorn

我想为 Nashorn 提供一个可用的函数,如下所示:

public class StackOverflow {
    private Object toSave;

    @Test
    public void test() {
        ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName("nashorn");
        ScriptContext context = jsEngine.getContext();
        context.setAttribute("saveValue", arg -> { toSave = arg; }, ScriptContext.ENGINE_SCOPE);
        jsEngine.eval("saveValue('one')");
        Assert.assertEquals("one", toSave);
    }
}

上面的代码无法编译,因为 ScriptContext.setAttribute() 需要一个对象,而 lambda 不是对象。如何将 javascript 名称设置为 java 函数?

编辑以澄清:

在 JavaScript 中,我们可以这样写:

var square = function(y) {
   return y * y;
};
square(9);

如果我用 Java 编写了 square,我如何将该函数分配给 JavaScript 变量?

最佳答案

感谢@Seelenvirtuose,事实证明您只需将其设置为 Consumer (或任何其他功能接口(interface)),然后 Nashorn 就会做正确的事情。下面的测试通过了。

public class StackOverflow {
    private Object toSave;

    @Test
    public void test() throws ScriptException {
        Consumer<String> saveValue = obj -> toSave = obj;
        ScriptEngine jsEngine = new ScriptEngineManager().getEngineByName("nashorn");
        ScriptContext context = jsEngine.getContext();
        context.setAttribute("saveValue", saveValue, ScriptContext.ENGINE_SCOPE);
        jsEngine.eval("saveValue('one')");
        Assert.assertEquals("one", toSave);
    }
}

编辑:我整理了一个很小的零依赖库,用于将 lambda 传递给脚本: JScriptBox 。对我有帮助,也许对你也有帮助。

private int square(int x) {
    return x * x;
}

@Test
public void example() throws ScriptException {
    TypedScriptEngine engine = JScriptBox.create()
        .set("square").toFunc1(this::square)
        .set("x").toValue(9)
        .buildTyped(Nashorn.language());
    int squareOfX = engine.eval("square(x)", Integer.class);
    Assert.assertEquals(81, squareOfX);
}

关于javascript - 在 Nashorn 中将 javascript 名称设置为 Java 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32596733/

相关文章:

javascript - 如何遍历firebase数据对象以列出

javascript - 如何将两个 geoJSON 要素集合添加到两个图层组中

java - JBOSS自定义登录

java - 为什么新的 Java 8 日期时间 API 没有纳秒精度?

javascript - 向客户端发送ajax错误问题

javascript - 在 Electron 生产模式下将SQLITE db文件存储在哪里?

java - 带参数的 REST API 查询

java - 使用 JRI 时,将 R-Errors(从控制台)发送到 Java 标准输出

java - 使用 Java Streams 从 map 列表中提取一个键,并创建一个 map 的 map

Java 8 List<T> 到 Map<T, (index)>