我有一个矩阵类,我想在这个类中创建一个名为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))
但它适用于矩阵中的每个值,数据的cos为0,0
我希望它看起来更像这个
matrix.map(Math.cos())
甚至
Matrix.map(function())
在java中有一种方法可以将方法作为参数传递而不在其中输入参数吗?
答案 0 :(得分:0)
Java 8附带了大量的functional interfaces。您可以使用其中一个来描述要在方法中作为参数传递的预期函数。
在您的情况下,要传递一个超出单个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 :(得分:0)
使用:: operator传递方法参考,例如
Math::cos
此外,您需要确保传递方法参考的方法应该接受functional interface
那就是说,
void map(Consumer<T> fn)
答案 2 :(得分:0)
Java中的函数编程由功能接口(只有一个抽象方法的接口)和lamdas支持。 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;
}