使用一个方法作为另一个方法的参数*Java处理*

Using a method as a parameter for another method *Java Processing*

你好,我正在研究一种将函数(数学函数,例如 f(x) = 3x + 2)应用于数组中每个元素的方法。我计划让这个函数是动态的,并且能够根据示例进行更改,而无需更改代码(在不同的公式之间切换)。我想将这些数学函数(公式)中的每一个存储在单独的方法中,这些方法将从一个主要方法 - mapFunc 调用。 mapFunc 将有两个参数:通过公式 运行 的数组,以及包含所选数学函数的方法。这样在我的主循环中调用 mapFunc 方法时,我就可以编写 mapFunc(myArray, myFormula())。 myFormula 是一种方法。在 java 8.0 中,我可以使用 lambda 表达式和其他方法引用来将 myFormula() 用作 mapFunc() 中的参数。但是,因为我使用的是仅支持 Java7 的软件 Processing。 0 完全,我无法使用 lambda 表达式和 Java8.0 中包含的其他功能。 我想要这样的方法:

void mapFunction(float[][] data, myFormula()) {
    for (int i = 0; i < data.length; i++) {
        for(int j = 0; j < data[0].length; j++) {
        data[i][j] = myFormula(data[i][j]));
        }
    }
 }

在java脚本中我可以写:

map(func) {
// Apply a function to every element of matrix
for (let i = 0; i < this.rows; i++) {
  for (let j = 0; j < this.cols; j++) {
    let val = this.data[i][j];
    this.data[i][j] = func(val);
  }
}

}

然后用 myMatrix.map(double());

调用它

有用的链接: https://www.codementor.io/eh3rrera/using-java-8-method-reference-du10866vx - 似乎不起作用。

在 Java 有 lambda 之前,实现这一点的方法是使用像 Runnable 这样的接口的匿名实例。像这样:

void doTheThing(Runnable r){
  r.run();
}

doTheThing(new Runnable(){
  public void run(){
    yourFunctionHere();
  }
});

或者如果你的函数需要一个参数,你可以像这样定义你自己的接口:

interface ValueChanger{
  public float changeValue(float value);
}

然后你可以创建一个接受 ValueChanger 实例的函数,如下所示:

void mapFunction(float[] data, ValueChanger valueChanger){
  data[0] = valueChanger.changeValue(data[0]);
}

您可以通过传入匿名实例来调用您的函数:

mapFunction(myArray, new ValueChanger(){
  public float changeValue(float value){
    return value * 2;
  }
});

However I am working in Processing and in this version I am unable to use these strategies (syntax errors). Maybe I just don't understand how these method references work

我不明白为什么使用 lambda 无法实现您尝试做的事情。
如果您可以使用 Java 8 编译器,您可以编写一个接受 DoubleUnaryOperator 参数的方法,该参数将是您需要将一个浮点数映射到另一个浮点数的函数,例如:

static void mapFunction(float[][] data, DoubleUnaryOperator function) {
    for (int i = 0; i < data.length; i++) {
        for (int j = 0; j < data[0].length; j++) {
            data[i][j] = (float) function.applyAsDouble(data[i][j]);
        }
    }
}

例如,此示例设置数组元素及其方块:

public static void main(String[] args) {
    float[][] data = new float[][] {{0F,1F}, {2F,3F}};
    mapFunction(data, a->a*a);
    System.out.println(Arrays.deepToString(data));

}

输出:

[[0.0, 1.0], [4.0, 9.0]]

如果您不能注意使用 Java 8 或 + 版本或任何第三方库,您可以引入自己的接口将浮点数映射到浮点数并使用匿名 class 而不是lambda 例如:

public interface FloatUnaryOperator  {
    float applyAsFloat(float operand);
}

static void mapFunction(float[][] data, FloatUnaryOperator function) {
    for (int i = 0; i < data.length; i++) {
        for (int j = 0; j < data[0].length; j++) {
            data[i][j] = function.applyAsFloat(data[i][j]);
        }
    }
}

public static void main(String[] args) {
    float[][] data = new float[][] {{0F,1F}, {2F,3F}};
    mapFunction(data, new FloatUnaryOperator() {

        @Override
        public float applyAsFloat(float operand) {
            return operand*operand;
        }
    });
    System.out.println(Arrays.deepToString(data));
}