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

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

```map(function)```

该函数与常规的 map 函数类似,将一个函数应用于矩阵中的每个元素,然后返回一个新的矩阵。请帮我完成这个函数的实现。
  public void map(T fn) {
      //do something
   }

该函数的理念是将任何方法作为参数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;
}

当我从我的主类发送调用时,我只能使用像参数这样的参数进行调用。
matrix.map(Math.cos(matrix.getData(0,0))

但是它应用于矩阵中每个值的数据在0,0处的cos值。

我希望它看起来更像这样。

matrix.map(Math.cos())

甚至更多

Matrix.map(function())

有没有一种方法在Java中传递方法作为参数而不需要输入它们的参数?

语法是 Math::cos - Henry
我尝试用 math::cos 代替 math.cos,但是我收到了一个错误提示:"表达式的目标类型必须是一个 functional 接口"。 - eyal mazuz
3个回答

1

Java 8提供了大量函数接口。您可以使用其中之一来描述要传递给方法的预期函数。

在您的情况下,如果要传递一个接受单个double参数并应用逻辑的函数,请使用java.util.function.DoubleUnaryOperator

static double foo(DoubleUnaryOperator fn){
    double aNumber = 2.0;  
    return fn.applyAsDouble(aNumber);
}

然后创建一个lambda表达式(或者实现了 DoubleUnaryOperator 接口的对象),并将其传递给 foo 方法:

foo(d -> d * 3);

public class Fn implements DoubleUnaryOperator {
    @Override
    public double applyAsDouble(double d) {
        return d * 3;
    }
}

1
使用::操作符传递方法引用,例如:
Math::cos

此外,您需要确保接受方法引用的方法应接受functional interface
话虽如此,
void map(Consumer<T> fn)

0
Java中的函数式编程是由函数接口(只有一个抽象方法的接口)和lambda支持的。Java提供了几个内置的函数接口。您可以使用Function / DoubleFunction这些接口具有一个抽象方法Function#apply。您也可以创建自己的函数接口,但最好使用API提供的现有解决方案,如果它满足您的要求。请参考下面的代码示例,以便更好地理解。
public void map(DoubleFunction<Double> fn) {
  //do something
  setData(10.0, Math::cos);
 //do something
}
private double setData(double data,  DoubleFunction<Double> fn) {
    data = fn.apply(data);
    return data;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接