Как передать параметр в Java лямбда

Я использую 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;
}

Ошибка компиляции: локальная переменная вендора, определенная во вложенной области видимости, должна быть окончательной или фактически конечной

2 ответа

До Java 8 мы не могли использовать не окончательную локальную переменную в анонимном классе. Это очень полезно в контексте лямбда-выражения. Пожалуйста, проверьте ссылку ниже лямбда-выражения Java с неокончательным параметром функции

Лучше изменить свой код

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

Или назначьте значение поставщика в другой конечной переменной.

Вы не можете использовать не конечные переменные в лямбда-выражении.

Один из вариантов - установить vendor в финал

Кроме того, вы можете изменить рефакторинг, чтобы использовать цикл for.

Другие вопросы по тегам