首页 > 解决方案 > 如何将字符串转换为 lambda 函数

问题描述

我需要将我输入的字符串变成 python 风格的 lambda 函数示例:

输入:

"x ^ 2 - 2xy + y ^ 2" // I introduce the function
eval (x, y) // Tells what variables to evaluate
2, 4 // x will be worth 2, and will be worth 4

输出:4

也就是说,我是这样操作的2 ^ 2 - 2 * 2 * 4 + 4 ^ 2。我在另一个 stackoverflow 问题中看到了一个类,但它对我不起作用:

代码:

import java.util.function.Function;
import javax.script.*;
public class ScriptFunction {
  public static void main(String[] args) throws Exception {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    @SuppressWarnings("unchecked") Function <Object, Object> f 
        = (Function <Object, Object>) 
          engine.eval(String.format("new java.util.function.Function(%s)",
                                    args[0]));
    for (int i = 1; i < args.length; i++) {
      System.out.println(f.apply(args[i]));
    }
  }
}

输入指令: java ScriptFunction 'function(x) 3 * x + 1' 17 23 47.

关联

错误: 在此处输入图像描述

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "javax.script.ScriptEngine.eval(String)" because "<local1>" is null
        at ScriptFunction.main(ScriptFunction.java:10)

有没有人有这样的课程?或者你能告诉我应该怎么做吗?我是新手,感谢您的理解和帮助

后记:我想让一个字符串成为

标签: java

解决方案


由于 java Function 接口只接受一个参数和一个返回值,因此您不能让它接受两个参数,但您可以使用有效的 javascript 让您的示例工作。

import java.util.function.Function;
import javax.script.*;
public class ScriptFunction {
  public static void main(String[] args) throws Exception {
    ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
    Function < Object, Object > f = (Function < Object, Object > ) engine.eval(
    "new java.util.function.Function(function(x){return 3*x + 1;})");
    for (int i = 0; i < args.length; i++) {
      System.out.println(f.apply(args[i]));
    }
  }
}

我没有为函数使用参数。我刚刚传递了字符串。当我运行它时

java ScriptFunction.java 1 2 3 4

我得到以下输出。

4.0
7.0
10.0
13.0


推荐阅读