【问题标题】:How to pass parameter to java lambda如何将参数传递给java lambda
【发布时间】:2018-11-08 23:44:50
【问题描述】:

我正在使用 Spring RetryTemplate 并使用此方法。想要传递一些参数(供应商)它给了我编译错误。我可以创建另一个变量 vendorName 作为 final 可以发送它。但我想使用变量vendor。它一定很简单,但没有得到它。请帮忙。

public Token getToken(final String tokenId) {
    String vendor = getVendor(tokenId);//returns some vendor name
    RetryTemplate retryTemplate = getRetryTemplate();
    Token token = retryTemplate.execute(context -> {
        logger.info("Attempted {} times", context.getRetryCount());
        return retrieveToken(tokenId, vendor);
    });
}

private RetryTemplate getRetryTemplate() {

    final FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
    fixedBackOffPolicy.setBackOffPeriod(getRandomNumber() * 1000);

    final SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
    retryPolicy.setMaxAttempts(5);

    final RetryTemplate retryTemplate = new RetryTemplate();
    retryTemplate.setBackOffPolicy(fixedBackOffPolicy);
    retryTemplate.setRetryPolicy(retryPolicy);

    return retryTemplate;
}

编译错误是:在封闭范围内定义的局部变量 vendor 必须是 final 或有效 final

【问题讨论】:

  • 那么,究竟是什么编译错误呢?
  • 我更新错误。它是相关的java lambda传递参数。
  • @Kiran vendor 从我能观察到的看来实际上是最终结果
  • 该代码不会产生该错误。

标签: java lambda java-8 spring-retry retrytemplate


【解决方案1】:

在 Java 8 之前,我们不能在匿名类中使用非最终局部变量。 它在 lambda 表达式的上下文中也非常有用。 请检查以下链接 Java Lambda Expression with Non-final Function Paramter

最好修改你的代码

public Token getToken(final String tokenId) {
    final String vendor = getVendor(tokenId);//returns some vendor name
    RetryTemplate retryTemplate = getRetryTemplate();
    Token token = retryTemplate.execute(context -> {
        logger.info("Attempted {} times", context.getRetryCount());
        return retrieveToken(tokenId, vendor);
    });
}

或者在另一个最终变量中分配供应商值。

【讨论】:

    【解决方案2】:

    您不能在 lambda 中使用非最终变量。

    一种选择是将vendor 设置为final

    或者,您可以重构为只使用 for 循环。

    【讨论】:

    • 我无法设置,因为我有一些基于我设置供应商的逻辑。我可以创建另一个变量作为最终使用。但我想传递现有的而不是创建一个新的。
    • @Kiran 那么你必须将它复制到一个最终的变量中。没有办法解决这个问题。
    • @LouisWasserman 好的。我在想我们可以传递一个变量。如果那是唯一的选择,那么我会这样做。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    相关资源
    最近更新 更多