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

上一篇: lambda expression vs static method

下一篇: When a variable is closed twice, where is it stored?