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

时间:2018-02-03 05:57:27

标签: java

我有一个矩阵类,我想在这个类中创建一个名为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中有一种方法可以将方法作为参数传递而不在其中输入参数吗?

3 个答案:

答案 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;
}