Fechando sobre variável imutável e acumulando valores em várias iterações como uma expressão lambda - Java 8
O cliente WebTarget em Jersey é implementado como um objeto imutável, e quaisquer operações para alterar o estado retornam um novo WebTarget. Para adicionar parâmetros de consulta a ele, que está chegando como umMap<>
o seguinte código foi escrito.
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;
}
Os problemas aqui são todas as chamadas para.queryParam()
retorna um novo WebTarget e estou empolgado com a forma de acumular, pois as variáveis usadas dentro de uma expressão lambda precisam ser finais ou implicitamente finais, sem nenhuma reatribuição.
EDITAR: Reduzir pode não ser uma opção nesse caso, como o WebTarget não possui o mecanismo de redução, que não consigo obter o queryParam de um objeto da web e defini-lo em outro. se a API WebTarget tivesse melhor suporte para acumulação, ela poderia ter sido usada.
UsavaJool para tentar alavancar o foldLeft, que falta na API Java 8 nativa, mas ainda atinge o fundo do poço, pois a API do WebTarget não tinha suporte para isso.
EDIT2: foldLeft é o caminho a seguir, conforme sugerido na resposta abaixo, escreveu um pequenoblogue nisto