Java 将数学函数作为函数参数传递

Java 将数学函数作为函数参数传递,java,functional-programming,Java,Functional Programming,我是初级java程序员 我想要一个函数,它以一个数学函数(即sin,cos,exp())为参数并对其进行积分 请注意,我要传递的是函数,而不是函数的值 函数是这样的,它接收一个数学函数作为参数,一个初始值,初始导数和它积分到的点。该函数返回曲线下的面积 我甚至不知道这是否可能,如果可能,请帮助我 谢谢。尝试使用方法引用: List<Double> list=getRandomDoubles(); list.stream().map(Math::sqrt) //Map to the s

我是初级java程序员

我想要一个函数,它以一个数学函数(即sin,cos,exp())为参数并对其进行积分

请注意,我要传递的是函数,而不是函数的值

函数是这样的,它接收一个数学函数作为参数,一个初始值,初始导数和它积分到的点。该函数返回曲线下的面积

我甚至不知道这是否可能,如果可能,请帮助我


谢谢。

尝试使用方法引用:

List<Double> list=getRandomDoubles();
list.stream().map(Math::sqrt) //Map to the square root
             .map(Math::log)//Map to the logarithm of the number
             .forEach(System.out::println);//Print each number
List List=getRandomDoubles();
list.stream().map(Math::sqrt)//映射到平方根
.map(Math::log)//映射到数字的对数
.forEach(System.out::println)//打印每个数字
Java是一种OOP(面向对象编程语言),不接受参数中的函数

为了实现这种行为,自Java 8以来,他们添加了使用
Lambda
表达式的可能性,以模拟在代码中使用函数的可能性,但实际上,您总是在传递对象

正如你所说,你是一个初学者,我首先推荐一些阅读材料:

该软件包提供了一种将函数存储为引用的方法

只要函数的类型相同,就可以将它们用作参数<例如,code>sin和
cos
都属于
double->double
类型,就Java而言,它们都是
DoubleFunction
或者更好的
doubleunaryaryoperator
(如果您想使用原语)或
Function

这意味着您可以声明如下函数:

public void foo(DoubleUnaryOperator f) {
    for (int i = 0; i < 10; i++)
       System.out.println(f.apply((double) i));
}
假设您希望创建一个方法,该方法使用一个函数来描述图形、初始值、结束值以及步长(delta),并希望在给定边界内计算图形下的面积

然后该函数将具有以下签名和框架实现:

public double area(DoubleUnaryOperator graph, double start, double end, double delta) {
    DoubleStream stream = DoubleStream
        .iterate(start, d -> d + delta)
        .limit((long)((end-start)/delta);
        // stream now consists of all values between start and end
        // with a difference of delta between them
        // now map it & collect it
}

这回答了你的问题吗?这对我来说是有意义的,虽然我是初学者,而这不是我熟悉的领域,我会深入研究并实现你的解决方案。@ USER8218如果这个答案对你有帮助,请考虑投票和它;是的,这是绝对有帮助的,并试图提高投票,但它说,投票只记录,而不是公开显示。
public double area(DoubleUnaryOperator graph, double start, double end, double delta) {
    DoubleStream stream = DoubleStream
        .iterate(start, d -> d + delta)
        .limit((long)((end-start)/delta);
        // stream now consists of all values between start and end
        // with a difference of delta between them
        // now map it & collect it
}