正如标题所说,我正在寻找使用 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)你需要记住,
然后它变得容易多了。
Function
、Consumer
、Supplier
、
以及那些专门用于原始类型的,
IntBinaryOperator
、IntUnaryOperator
等。
关于java - 在 Java 中使用 lambda 作为类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47485856/