传递函数作为参数(Lambda)

not*_*ber 3 java lambda java-8

我正在尝试理解Java 8的Lambda表达式.在示例中,我想解析许多文件.对于每个文件,我需要创建特定模板的新实例(对于一次传递的所有文件,它是相同的).

如果我理解正确,这就是Lambda表达式的优点.

任何人都可以用简单的术语向我解释如何将调用传递给模板的构造函数作为参数?(这样就可以了new Template1(),new Template2()等等).

import java.io.File;

public class Parser {

  public static void main(String[] args) {
    new Parser(new File[]{});
  }

  Parser(File[] files) {
    for (File f : files) {
      // How can I pass this as a parameter?
      Template t = new Template1();
    }
  }

  public class Template {
    // Code...
  }

  public class Template1 extends Template {
    // Code...
  }

  public class Template2 extends Template {
    // Code...
  }
}
Run Code Online (Sandbox Code Playgroud)

McD*_*ell 10

您可以使用供应商和构造函数参考:

public static void main(String[] args) {
  new Parser(new File[]{}, Template1::new);
}

Parser(File[] files, Supplier<Template> templateFactory) {
  for (File f : files) {
    Template t = templateFactory.get();
  }
}
Run Code Online (Sandbox Code Playgroud)

功能型可以用于一个参数的构造函数一样Template1(File):

public static void main(String[] args) {
  new Parser(new File[]{}, Template1::new);
}

Parser(File[] files, Function<File, Template> templateFactory) {
  for (File f : files) {
    Template t = templateFactory.apply(f);
  }
}
Run Code Online (Sandbox Code Playgroud)

Java 8 API在java.util.function包中提供了许多标准功能接口,尽管这些接口通常不会超出两个参数.你可以使用第三方的nary功能接口(我为KludJe做了一些)或自己编写.

自定义实现可能如下所示:

public static void main(String[] args) {
  new Parser(new File[]{}, Template1::new);
}

Parser(File[] files, TemplateFactory templateFactory) {
  for (File f : files) {
    Template t = templateFactory.createFrom(f);
  }
}

public static interface TemplateFactory {
  Template createFrom(File file);
}
Run Code Online (Sandbox Code Playgroud)