有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将字符串转换为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

也就是说,我像这样操作它。 我在另一个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

Link

错误: enter image description here

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

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

附言:我想让字符串成为


共 (2) 个答案

  1. # 1 楼答案

    由于java函数接口只接受一个参数和一个返回值,因此不能让它接受两个参数,但可以通过使用有效的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

  2. # 2 楼答案

    现在有点不清楚你们到底想解决什么问题,为什么。了解这一点将有助于定制解决方案;e、 g.在一个类上使用lambda函数比使用方法更好吗;你真的想执行JavaScript吗;等等

    话虽如此,我还是要回答这个问题:返回一个Java函数类型,在一组参数上执行给定的JavaScript函数

    import javax.script.*;
    import java.util.function.BiFunction;
    
    public class ScriptRunner {
        public static void main(String[] args) {
            String script = "Math.pow(x, 2) - 2 * x * y + Math.pow(y, 2)";
            BiFunction<Integer, Integer, Double> eval = new ScriptRunner().asBiFunction(script, Double.class);
            System.out.println(eval.apply(2, 4)); // -10
        }
    
        public <X, Y, R> BiFunction<X, Y, R> asBiFunction(String javaScriptCode, Class<R> returnType) {
            return (x, y) -> returnType.cast(eval(code, x, y));
        }
    
        private Object eval(String javaScriptCode, Object x, Object y) {
            Bindings bindings = new SimpleBindings();
            bindings.put("x", x);
            bindings.put("y", y);
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
            try {
                return engine.eval(code, bindings);
            } catch (ScriptException e) {
                throw new RuntimeException(e);
            }
        }
    }
    

    这个类的关键是asBiFunction,它返回一个^{},它接受两个参数并返回结果计算。bi函数委托给eval方法,该方法将两个参数绑定到“x”&;“y”Javascript变量,并使用deprecatedNashorn Javascript引擎使用该绑定执行代码

    本例中的输入脚本已重写为等效的有效JavaScript代码