使用一个方法作为另一个方法的参数*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));
}
你好,我正在研究一种将函数(数学函数,例如 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));
}