如果Java程序员想要传递一个函数,他们在Java 8之前做了什么?

Wat*_* v2 6 java lambda programming-languages

请温柔地对待我.

我听说Java 8引入了lambdas.但在此之前,如果你想传递一个函数,比方说,作为一个论点,你做了什么?

我能想到的一种方法是创建一个单一的方法接口,如下所示:

public interface ISingleMethodInterface
{
  bool Really(int n);
}

public bool GimmeFunction(ISingleMethodInterface interface, int n)
{
  return interface.Really(n);
}
Run Code Online (Sandbox Code Playgroud)

但这是作为一等公民的功能非常有限的应用,因为:

  1. 除了执行该函数或将该对象传递给另一个方法之外,您无法做很多事情.有了lambdas,你可以创作.例如,你可以像这样否定那个lambda:

    public bool GimmeLambdaAndIWillComputeItsInverse(Func<int, bool> predicate, int n)
    {
      return !predicate(n);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 你不能归还lambdas或他们的衍生物.我的意思是,你只能像这样返回同一个对象:

    // I know Java doesn't have Tuples but let's forget that for now
    public Tuple GimmeFunction(ISingleMethodInterface interface, int n)
    {
      return new Tuple { Item1 = interface, Item2 = n };
    }
    
    Run Code Online (Sandbox Code Playgroud)

    使用lambdas,您可以返回如下导数:

    public Func<int, bool> GetInverseFunction(Func<int, bool> predicate, int n)
    {
      return n => !predicate(n);
    }
    
    Run Code Online (Sandbox Code Playgroud)

那么,如果你需要做这样的事情,你做了什么?

Lew*_*och 3

一种只是传递函数接口的实例。你对此相对于 lambda 的诋毁有点过分,因为在 Java 中,lambda 确实是函数式接口。因此,由于一个是根据另一个来实现的,所以它们并不比另一个强。区别在于源代码的可读性如何打动您。