lambda表达式与静态方法
我有一个关于lambda表达式的重用性的问题,没有代码重复。 例如,如果我有一个帮助器方法,我可以很容易地将它编码为一个静态方法,并且可以从其他类中引用它而不存在代码重复。 这将如何在lambda表达式中工作? 例子:我写了下面的静态方法
public class MyUtil {
public static int doubleMe(int x) {
return x * 2;
}
}
我可以在整个项目的多个地方重复使用相同的方法而无需重复代码
public class A {
public void someOtherCalculation() {
MyUtil.doubleMe(5);
}
}
public class B {
public void myCalculation() {
MyUtil.doubleMe(3);
}
}
当它涉及到一个lambda函数时它将如何工作,编写一次函数并在多个类中使用相同的函数。
Function<Integer, Integer> doubleFunction = x -> x * 2;
在我的例子中,我将在哪里编写上述lambda函数,以及如何在类A和B中重用它们?
我在哪里写上述lambda函数
由于你的函数没有引用任何字段,所以把它放在静态final字段中是合适的:
class Utility {
public static final Function<Integer,Integer> doubleFunction = x -> x * 2;
}
我将如何在A和B级重复使用它?
您可以将其称为Utility.doubleFunction
,并将其传递到所需的上下文中:
callMethodWithLambda(Utility.doubleFunction);
请注意,方法引用允许您定义一个函数,并将其用作lambda:
class Utility {
public static Integer doubleFunction(Integer x) {
return x*2;
}
}
...
callMethodWithLambda(Utility::doubleFunction);
这种方法非常灵活,因为它允许您在多个上下文中重复使用相同的代码。
真的,匿名函数适用于不需要重用代码的情况。
愚蠢的例子,但说你正在使用map
添加两个列表中的每个数字。 如果这是你可能需要的一种常见操作,那么在一个数字上加上2的静态函数比编写相同的lambda表达式更有意义。
但是,如果您有一个函数将两个添加到列表中,那么在本地将“添加两个”函数定义为一个lambda更有意义,因此您不要使用其他位置不需要的代码来插入类。
在编写广泛使用高阶函数的Clojure时,创建本地匿名函数来整理我写的“全部”函数中的代码是很常见的。 绝大多数这些匿名函数在“全局”范围(或类范围)中是非感性的; 特别是因为它们通常关闭局部变量,所以它们不可能是全局的。
使用lambda表达式,您不必担心可重用性(实际上,大多数lambda表达式都没有被重用)。 如果你想要一个Function
指针来指向这个方法,你可以声明如下所示:
Function<Integer, Integer> doubleFunction = MyUtil::doubleMe;
并将其传递给任何方法或流应用/映射,例如:
public static void consume(Function<Integer, Integer> consumer, int value){
System.out.println(consumer.apply(value));
}
public static void main(String[] args) throws Exception{
Function<Integer, Integer> doubleFunction = MyUtil::doubleMe;
consume(doubleFunction, 5);
}
链接地址: http://www.djcxy.com/p/51555.html