2017-11-25 129 views
2

正如标题所说,我正在寻找使用lambda表达式来实现一些非常简短的方法,这一切都不为人所知。使用lambdas作为Java中的类的方法

Python可以做到这一点,C#可以做到这一点,在某种程度上我相信即使是C++现在也可以做到。

但我试图做一个Java类没有成功的相同,我查了一切可能回答这个问题,没有运气。我宁愿不使用100个函数接口来集群我的应用程序,只是为了能够使用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)); 

    } 
} 
+4

你明白了。只需将它们作为静态方法实现,并且当您有例如需要DoubleBinaryOperator作为参数的API时,可以传递Main :: log作为参数。 –

回答

4

左侧的类型是否正确?

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。 这不太理想,因为它需要autobox参数和返回值。

而要实际调用这些函数,则不能简单地编写log(...), 您需要接口中指定的相应方法名称。 在任何IDE中,方法名都应该很容易找到,因为功能接口的优点是只有一种方法(在普通标准方法的基础上)。

有一些常见的功能界面需要记住, 然后它变得更容易。 把我的头,FunctionConsumerSupplier, 的顶部,以及那些专门为基本类型, IntBinaryOperatorIntUnaryOperator,等等。

+0

谢谢,现在有道理。我猜lambdas的外观仍然处于初级阶段。但是有没有办法可以跳过“apply”方法(或者不管是什么情况)并简单地写'log(8,2)'?使函数对象本身可调用? –

+1

@RaresDima这是一个耻辱,但不幸的是,你不得不像Java那样在C#中使用它。 –

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在手工采摘最合适的功能接口任务或定义自己的如果有必要

相关问题