传递函数作为参数(Lambda)

时间:2014-07-23 12:54:30

标签: 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...
  }
}

1 个答案:

答案 0 :(得分:9)

您可以使用Supplier和构造函数reference

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

Function类型可用于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);
  }
}

Java 8 API在java.util.function包中提供了许多标准功能接口,尽管这些接口通常不会扩展到两个参数之外。您可以使用第三方nary功能接口(我为some制作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);
}