Как передать параметр в Java лямбда - PullRequest
0 голосов
/ 09 ноября 2018

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

0 голосов
/ 09 ноября 2018

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

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

0 голосов
/ 09 ноября 2018

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

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

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

...