Как передать параметр в 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.