请看这段代码:
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;
}
}
);
顺便说一句,如果您认为主题的名称不好,请将其编辑为您想要的内容。
答案 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)
我可以看到两种方法:
在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
}
这有效,但容易出错,需要非常小心。您需要确保n
的替换有效,这有点棘手。例如,上面的快速和脏代码将评估" 10n" n = 10到" 1010"由于它取代n的方式。您还需要避免使用各种无效表达式,例如" 10; 20"否则将评估为20.0。