Закрытие неизменяемой переменной и накопление значений за несколько итераций в виде лямбда-выражения - Java 8
Клиент WebTarget в Джерси реализован как неизменный объект, и любые операции по изменению состояния возвращают новый объект WebTarget. Чтобы добавить параметры запроса к нему, который приходит какMap<>
следующий код был написан.
public WebTarget webTarget(String path, Map<String, String> queryMap) {
WebTarget webTarget = client.target(this.address.getUrl()).path(path);
if (queryMap != null)
queryMap.entrySet().forEach(e -> webTarget.queryParam(e.getKey(), e.getValue()));
return webTarget;
}
Проблемы здесь каждый звонок.queryParam()
возвращает новый WebTarget, и я застрял в том, как накапливаться, поскольку переменные, используемые внутри лямбда-выражения, должны быть либо окончательными, либо неявно окончательными, без каких-либо переназначений.
РЕДАКТИРОВАТЬ: Уменьшение может не быть вариантом в этом случае, так как в WebTarget отсутствует механизм сокращения, поэтому я не могу получить queryParam из одной веб-цели и установить ее в другой. если бы у WebTarget api была лучшая поддержка накопления, его можно было бы использовать.
ИспользуемыйJool попытаться использовать foldLeft, которого нет в нативном Java 8 API, но все же он достиг дна, так как WebTarget api не хватало его поддержки.
EDIT2: foldLeft - это способ, как предложено в ответе ниже, написал небольшойблог на этом