【问题标题】:Define a Callable with arguments in constructor using Lambda expression使用 Lambda 表达式在构造函数中定义带有参数的 Callable
【发布时间】:2016-03-04 17:17:48
【问题描述】:

我正在尝试使用 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 构造函数(无参数)而是我的例程需要的参数?

谢谢

【问题讨论】:

  • 一个可调用对象在调用时不带参数,即它有一个方法call() 如果您想在创建可调用对象时使用可用的值,您可以引用它们,它们将被捕获。

标签: lambda java-8 callable


【解决方案1】:

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。

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多