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

Rar*_*ima 2 java methods lambda functional-programming function

正如标题所说,我希望使用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));

    }
}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 5

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

static double log = (double val, double base) -> Math.log(val) / Math.log(base);
Run Code Online (Sandbox Code Playgroud)

是右手边的类型double吗?事实并非如此.它看起来像一个功能.所以左侧的类型也应该是一个函数.

您不必声明许多接口,因为它们中的很多接口已经存在.

我同意,DoubleBinaryOperator并没有完全放弃,但这正是你要找的:

DoubleBinaryOperator log = (val, base) -> Math.log(val) / Math.log(base);
Run Code Online (Sandbox Code Playgroud)

一个不太理想的替代方案,但更容易记住,可能是BiFunction:

BiFunction<Double, Double, Double> log = (val, base) -> Math.log(val) / Math.log(base);
Run Code Online (Sandbox Code Playgroud)

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

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

您需要记住一些常见的功能接口,然后它变得容易多了.关闭我的头顶,Function,Consumer,Supplier,以及那些专门用于基本类型, IntBinaryOperator,IntUnaryOperator,等等.