使用Lambda表达式在构造函数中使用参数定义Callable

时间:2015-11-30 22:35:39

标签: lambda java-8 callable

我正在尝试使用Lambda表达式重写以下Callable实现:

    public class NLQueryTask implements Callable<NLQuery> {
    private String questionText, languageTranslationModelId;

    public NLQueryTask(String questionText, String languageTranslationModelId) {
        this.questionText = questionText;
        this.languageTranslationModelId = languageTranslationModelId;
    }

    @Override
    public NLQuery call() throws Exception {...}

如果我尝试在Lambda表达式中包含参数,则会出现编译器错误:

Callable<Integer> task = (String questionText, languageTranslationModelId) -> {...

显然我错过了一些东西(我今天开始阅读有关Lambda表达式的内容)。我应该如何定义Lambda表达式,以便它不使用默认的Callable构造函数(没有参数),而是使用我的例程需要的参数?

由于

1 个答案:

答案 0 :(得分:3)

lambda表达式在目标接口中的单个抽象方法之后建模,在这种情况下为Callable#call()。此方法具有空参数列表。 lambda表达式的参数列表也必须为空。

您可以捕获您作为参数传递给lambda正文中的NLQueryTask构造函数的值。

String questionText = "some text";
String languageTranslationModelId = "1234";

Callable<Integer> task = () -> {
    System.out.println(questionText);
    return Integer.parseInt(languageTranslationModelId); // whatever
};

显然,捕获的局部变量必须有效final