正如标题所说,我希望使用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));
}
}
答案 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中找到,
因为功能接口的好处是只有一种方法(在普通标准方法之上)。
您需要记住一些常见的功能接口,
然后它变得容易多了。
在我的头顶,Function
,Consumer
,Supplier
,
以及专门用于原始类型的那些,
IntBinaryOperator
,IntUnaryOperator
等等。
答案 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为当前任务选择最合适的功能界面,或在必要时定义您自己的 。