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)
左侧的类型看起来是否正确?
Run Code Online (Sandbox Code Playgroud)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);
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
,等等.
归档时间: |
|
查看次数: |
63 次 |
最近记录: |