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中重用相同的函数?


答案 1

我将在哪里编写上述 lambda 函数

由于您的函数不引用任何字段,因此将其放在静态最终字段中是合适的:

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);

这种方法非常灵活,因为它允许您根据需要在多个上下文中重用相同的代码。


答案 2

实际上,匿名函数适用于不需要重用代码的情况。

举个愚蠢的例子,但假设你用来给列表中的每个数字加两个。如果这是您可能需要的常见操作,则向数字添加 2 的静态函数比在任何地方写入相同的 lambda 更有意义。map

但是,如果您有一个向列表中添加两个的函数,那么将“添加两个”函数在本地定义为 lambda 会更有意义,这样您就不会用其他任何地方都不需要的代码来插入你的类。

在编写广泛使用高阶函数的Clojure时,我通常会创建本地匿名函数来整理我正在编写的“完整”函数中的代码。这些匿名函数中的绝大多数在“全局”范围(或类范围)中是无意义的;特别是因为它们通常对局部变量有闭包,所以它们无论如何都不可能是全局的。