使用String更改double值

时间:2017-03-24 17:09:06

标签: java

请看这段代码:

       testFunction(input, a, b, 100, new FPFunction() {
                public double eval(double n) {
                        double whatShouldBeReturned = 2+n;
                        return whatShouldBeReturned;

                }
            }
    );

只是为了让你知道FPFunction是一个接口,它的代码是:

    interface FPFunction {
    double eval(double n);
}

上面的代码帮助我对“2 + x”功能做了一些计算,就是这样。 如果我想改变我的功能,我应该将其硬编码到我的程序代码中,例如将其用于“x * 5 + 3”函数我应该将FPFunction的实现更改为:

      testFunction(input, a, b, 100, new FPFunction() {
                public double eval(double n) {

                        double whatShouldBeReturned = n*5+3;
                        return whatShouldBeReturned;

                }
            }
    );

这正是我不喜欢的。我想通过用户界面更改功能,而不是硬编码。 我的假设是有这样的方式:

        testFunction(input, a, b, 100, new FPFunction() {
                public double eval(double n) {
                        String mytring="2+n";
                        double whatShouldBeReturned =AppropriateMethod(myString);
                        return whatShouldBeReturned;

                }
            }
    );
  • 如果您认为这种方式有效,请告诉我什么是“properMethod(String s)”的身体。
  • 或者如果您有任何其他想法,请说。

顺便说一句,如果您认为主题的名称不好,请将其编辑为您想要的内容。

3 个答案:

答案 0 :(得分:0)

尽管属于好的或不好的方法,你可以肯定这样做......

java是一种强大的语言,所以你需要首先想一想,如果你是一个好的设计来实现你在这里要求的东西,并避免你的客户自杀:

Haivng对此答复说:

java有一个允许你评估脚本的引擎,所以如果你的方程是一个字符串,而你的引擎是一个javascript实例,那么你可以提供这样一个"灵活的"

请考虑以下代码段:

public interface FPFunction {
    double eval(double n) throws NoSuchMethodException;
}

public class JavaEngImpl implements FPFunction {
    static String fx = "2+x";

    public static void main(final String[] args) throws NoSuchMethodException {
        final JavaEngImpl t = new JavaEngImpl();
        System.out.println(t.eval(2));
        System.out.println(t.eval(1));
        System.out.println(t.eval(5));
        // now cahnge the equation
        JavaEngImpl.fx = "3 * x";
        System.out.println("\nnow with: " + JavaEngImpl.fx);
        System.out.println(t.eval(2));
        System.out.println(t.eval(1));
        System.out.println(t.eval(5));
    }

    @Override
    public double eval(final double n) throws NoSuchMethodException {
        final ScriptEngineManager factory = new ScriptEngineManager();
        final ScriptEngine engine = factory.getEngineByName("JavaScript");
        Object ret = null;
        try {
            final String finalEquation = fx.replace("x", String.valueOf(n));
            ret = engine.eval(finalEquation);
        } catch (final ScriptException ex) {
            System.err.println(ex);
        }
        return (Double) ret;
    }
}

输出将是:

  

4.0

     

3.0

     

7.0

     

现在:3 * x

     

6.0

     

3.0

     

15.0

答案 1 :(得分:0)

您可以尝试使用lambda表达式解决您的任务:

// functional interface
interface Operation
{  
  double perform(double d);
}  
class Main
{  
  // method that expects instance of the interface
  static double calculate(double d, Operation op)
  {  
    return op.perform(d);
  }  
  public static void main(String[] args)
  {  
    // lambda expression
    Operation n2 = (d) -> d + 2.;
    Operation n3 = (d) -> d + 3.;
    // method call
    double din = 1., result;
    result = calculate(din, n2);
    System.out.printf("operation: %s ; input: %f; result: %f%n", n2, din, result);
    result = calculate(din, n3);
    System.out.printf("operation: %s ; input: %f; result: %f%n", n3, din, result);
  } // end main
} // end class Main

答案 2 :(得分:0)

我可以看到两种方法:

  1. 在JDK中使用通用脚本引擎。例如:

    static ScriptEngineManager engineManager = new ScriptEngineManager();
    static ScriptEngine engine = engineManager.getEngineByName("nashorn");
    
    public static double eval(String expression, double n) throws NumberFormatException, ScriptException {
        String processedExpression = expression.replaceAll("n", Double.toString(n)); //Beware - this is a bad way of doing this
        return Double.parseDouble(engine.eval(processedExpression).toString())
    }
    
    public static void main(String... args) throws Throwable {
        System.out.println(eval("3*n+5", 10)); //Prints 35.0
    }
    
  2. 这有效,但容易出错,需要非常小心。您需要确保n的替换有效,这有点棘手。例如,上面的快速和脏代码将评估" 10n" n = 10到" 1010"由于它取代n的方式。您还需要避免使用各种无效表达式,例如" 10; 20"否则将评估为20.0。

    1. 使用Javaluator
    2. 等库