java - 在 Java 中使用 lambda 作为类的方法

标签 java function methods lambda functional-programming

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

Python 可以做到,C# 可以做到,在某种程度上我相信现在甚至 C++ 也可以做到。

但我试图对 Java 类做同样的事情,但没有成功,我查找了任何可能回答这个特定问题的东西,但没有运气。我宁愿不将我的应用程序与 100 个功能接口(interface)聚集在一起,只是为了能够将 lambda 用于更琐碎的功能或方法,因为这会破坏编写更少代码的目的。

这是我尝试过的方法(显然,它们都不起作用,第二个接近了,因为它至少认识到了一个 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));

    }
}

最佳答案

左侧的类型看起来正确吗?

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

右边的类型是double吗? 它不是。它看起来像一个函数。 所以左边的类型也应该是一个函数。

你不必声明很多接口(interface), 因为其中很多已经存在于图书馆中。

我同意,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(...), 您需要接口(interface)中指定的适当方法名称。 方法名称应该在任何 IDE 中都很容易找到, 因为功能接口(interface)的好处是只有一种方法(在通用标准方法之上)。

有一堆常用的函数式接口(interface)你需要记住, 然后它变得容易多了。 FunctionConsumerSupplier、 以及那些专门用于原始类型的, IntBinaryOperatorIntUnaryOperator 等。

关于java - 在 Java 中使用 lambda 作为类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47485856/

相关文章:

java - 使用 HtmlUnit 下载 xhr 时缺少附件

java - Intent 不适用于点击事件

javascript - 表示函数类型的词,该函数将结果短路,直到经过特定的调用间隙

postgresql - 将laSTLogin保存在表中

c# - 如何在 C# 中编写超时方法

Java 插入到 mySQL 工作台

java - 使用 KeyBindings Java 停止暂停键保持

c - Realloc和一个函数还是malloc和两个函数?

java - 将方法调用放入 ArrayList?

java - 写入文件java