[英]passing function into function java
我正在努力用Java实现一些基本的计算数学。 牛顿-拉普森法是找到函数f(x)的根(其中根是xi的值,其中f(xi)= 0)的一种方法。 为了用Java实现,我首先创建了一个基本类(包含Newton-Rhapson方法的类)和函数f(x)的一些定义:
public class CompMaths {
public double Newton(double x) {
//find root of f(x)
}
public double f(double x) {
//definition of f(x)
}
}
这样做时,如果我希望它与用户想要的f(x)的任何定义兼容,即说f(x)= x ^ 2,f(x)= x * sin(x),为f(x)的每个定义创建一个单独的类,该类还必须包含Newton-Rhapson方法的定义(以及许多其他我需要实现的comp数学方法)。 这似乎太过分了。 另外,它向用户公开了我的CompMaths类,但我不希望这样。 取而代之的是,能够定义每个函数并将其“传递”进去会很棒,即
public double Newton(double x, f(x)) ...
我确定所有人都知道Java不支持此功能。 我最初的想法是,如果传入定义为f(x)的对象,将其称为Func,即
公共双牛顿(双x,Func函数)...
因此最初,我认为这不是最好的解决方案,因为我必须为每个不同的Func类对象都具有CompMaths的多个定义。 这显然是荒谬的,并且只是从以前扭转了问题。 为了克服这个问题,我想:“好吧,我想使用一个唯一的类定义Func对函数f(x)进行多个不同的定义。想到的一个解决方案是-使用抽象方法f(x)使Func抽象,即
public abstract class Func {
public abstract double f(double x);
}
因此,现在我只需要为扩展Func的每个函数创建单独的类,并拥有自己的f(x)定义,f(x)的一些示例,将它们称为f1(x)= x ^ 2和f2(x) = x-sin(x ^ 2)即
public class f1 extends Func {
@Override
public double f(double x) {return x*x;}
}
public class f2 extends Func {
@Override
public double f(double x) { return x - Math.Sin(x*x);}
}
现在,如果我想在牛顿法中使用f1或f2
double x1 = 3, x2 = 4;
CompMaths compMaths = new CompMaths();
compMaths.Newton(x1, new f1());
compMaths.Newton(x2, new f2());
这似乎工作得非常好(注意-可以将Newton定义为static,以避免必须创建CompMaths对象)。 用户只需要通过扩展Func并定义自己的f(x)来创建其功能。 关于CompMaths类的任何内容都不会公开。 所以我很高兴,但是我绝对不会认为自己是专家,所以我想我会提出来看看人们的想法,看看是否有更好的方法。
任何意见将不胜感激。 谢谢大卫
为什么不使用Java 8的现有Function
接口来定义您的newton
方法?
public double newton(double x, Function<Double,Double> f) {
...
}
并使用lambda表达式调用它:
double x1 = 3, x2 = 4;
CompMaths compMaths = new CompMaths();
compMaths.newton(x1, x -> x * x);
compMaths.newton(x2, x -> x - Math.sin(x*x));
编辑:正如JB Nizet所评论的,如果所有函数都使用double
参数并返回double
值,则使用DoubleUnaryOperator
代替Function<Double,Double>
会更有效,因为DoubleUnaryOperator
对原始类型进行操作,因此没有装箱/拆箱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.