使用lambdas作为Java中的类的方法

时间:2017-11-25 12:14:35

标签: java function methods lambda functional-programming

正如标题所说,我希望使用lambdas实现一些非常简短的类方法,这是闻所未闻的。

Python可以做到,C#可以做到,在某种程度上我相信即使是C ++也可以做到。

但是我试图用Java类做同样的事情没有成功,我查找了任何可能没有运气回答这个特定问题的东西。我宁愿不用100个功能接口来集群我的应用程序,只是为了能够使用lambdas来处理更简单的函数或方法,因为这会破坏编写更少代码的目的。

这是我尝试过的(显然,它们都没有奏效,第二个接近,因为它至少认识到一个lambda在那里的事实:

import static java.lang.Math.*;

class Main {

    static double log = (double val, double base) -> Math.log(val) / Math.log(base); // First try. Python way.

    static double log = (val, base) -> Math.log(val) / Math.log(base); // Second try. Also inspired from the 
                                                                       // Python way, somewhat similarly to the
                                                                       // F# or haskell way.

    static double log(double val, double base) -> Math.log(val) / Math.log(base); // Third try. The C# way.

    public static void main(String[] argv){

        System.out.println(log(8,2));

    }
}

2 个答案:

答案 0 :(得分:5)

左侧的类型看起来是否正确?

static double log = (double val, double base) -> Math.log(val) / Math.log(base);

是右侧double的类型吗? 事实并非如此。它看起来像一个功能。 因此,左侧的类型也应该是一个函数。

您不必声明很多接口, 因为它们中已有很多已存在。

我同意,DoubleBinaryOperator并没有完全脱掉舌头, 但这就是你要找的东西:

DoubleBinaryOperator log = (val, base) -> Math.log(val) / Math.log(base);

不太理想的选择,但更容易记住,可能是BiFunction

BiFunction<Double, Double, Double> log = (val, base) -> Math.log(val) / Math.log(base);

也就是说,BiFunction是一个获取2个double参数并返回double的函数。 这不太理想,因为它需要自动提取参数和返回值。

实际上要调用这些函数,你不能简单地写log(...), 您需要在接口中指定的相应方法名称。 方法名称应该很容易在任何IDE中找到, 因为功能接口的好处是只有一种方法(在普通标准方法之上)。

您需要记住一些常见的功能接口, 然后它变得容易多了。 在我的头顶,FunctionConsumerSupplier, 以及专门用于原始类型的那些, IntBinaryOperatorIntUnaryOperator等等。

答案 1 :(得分:2)

这在java中是等效的:

DoubleBinaryOperator log = (val, base) -> Math.log(val) / Math.log(base);
System.out.println(log.applyAsDouble(8,2));

或者您可以将其提取到方法中:

public static double log(DoubleBinaryOperator doubleBinaryOperator, double val, double base){
       return  doubleBinaryOperator.applyAsDouble(val, base);
}

然后做:

System.out.println(log((val, bas) -> Math.log(val) / Math.log(bas), 8, 2));

请参阅Package java.util.function为当前任务选择最合适的功能界面,或在必要时定义您自己的