如何在java中将函数作为参数传递

eya*_*zuz 6 java

我有一个矩阵类,我想在这个类中创建一个名为 map 的函数,它看起来像这样

  public void map(T fn) {
      //do something
   }
Run Code Online (Sandbox Code Playgroud)

该函数背后的想法是作为参数 fn,它可以是任何方法并将此方法应用于矩阵中的每个数字。

它背后的想法是针对神经网络上的编码训练视频,但我尝试在 Java 中对其进行操作,但没有奏效。我搜索 lambda 表达式,但是当我使用它时,它只让我传递像 Math.cos(arg ) 里面有一个参数。但我希望它在没有任何参数的情况下传递当前函数看起来像这样

interface lambda<T> {
double foo(T fn);
}

public void map(T fn) {
    for(int i = 0 ; i< this.getRow() ; i++) {
        for(int j = 0 ; j< this.getCol(); j++) {
            int a = i;
            int b = j;
            lambda mycode = (T) -> setData(matrix[a][b], fn);
            matrix[i][j] = mycode.foo(fn);
        }
    }
}
private double setData(double data, T fn) {
    data = (double) fn;
    return data;
}
Run Code Online (Sandbox Code Playgroud)

当我从主类发送调用时,我只能使用类似的参数调用

matrix.map(Math.cos(matrix.getData(0,0))
Run Code Online (Sandbox Code Playgroud)

但它适用于矩阵中的每个值 0,0 处数据的 cos

我希望它看起来更像这样

matrix.map(Math.cos())
Run Code Online (Sandbox Code Playgroud)

甚至

Matrix.map(function())
Run Code Online (Sandbox Code Playgroud)

java中有没有办法将方法作为参数传递而不在其中输入参数?

Shm*_*ein 1

Java 8 附带了大量的函数接口。您可以使用其中之一来描述要在方法中作为参数传递的预期函数。

在您的情况下,要传递除单个double参数外并应用逻辑的函数,请使用java.util.function.DoubleUnaryOperator:

static double foo(DoubleUnaryOperator fn){
    double aNumber = 2.0;  
    return fn.applyAsDouble(aNumber);
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个 lambda (或实现 的对象DoubleUnaryOperator)并将其传递给foo方法:

foo(d -> d * 3);
Run Code Online (Sandbox Code Playgroud)

或者

public class Fn implements DoubleUnaryOperator {
    @Override
    public double applyAsDouble(double d) {
        return d * 3;
    }
}
Run Code Online (Sandbox Code Playgroud)