繁体   English   中英

将函数传递给函数java

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM