Eu tenho uma lista de triples
List<Triple<String, String, String>> triplets;
Quero grupo em um mapa como este
Map<Pair<String, String>, String> mapping;
Onde value
do mapa é o terceiro elemento do triplo. E no caso do mesmo key
deve substituir o terceiro valor restante.
Por exemplo
def triples = [ {a, b, c} ; {a, d, e} ; {a, b, f } ]
// grouping
def map = [ {a,b} : c ; {a, d} : e ]
Como fazer isso usando Java 8
e sua grouping
em correntes?
Isso deve fazer o truque:
Map<Pair<String, String>, String> result = triplets.stream()
.collect(
Collectors.toMap(
t -> new Pair(t.getOne(), t.getTwo()),
Triple::getThree,
(v1, v2) -> v2
)
);
Exemplo de uma classe par parcial:
public class Pair<T, U> {
//...
@Override
public int hashCode() {
return one.hashCode() + two.hashCode();
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Pair))
return false;
Pair p = (Pair) obj;
return p.one.equals(one) && p.two.equals(two);
}
}
A HashMap
usos classe equals
método para identificar objetos-chave única. Então, primeiro você precisa para substituir equals
e hashcode
métodos para mostrar a igualdade lógica dos Pair
objetos para a Map
classe.
Em seguida, voltar para os córregos e lambda. Para cada utilização tripleto Collectors.toMap
com o Pair
objecto que a chave e o outro valor remanescente do Triplet
que o valor. Em seguida, forneça um mergeFunction
para lidar com conflitos de chave. No seu caso, você precisa manter o valor anterior enquanto descarta novo valor. Isso é tudo que você precisa fazer.
Atualizar
Eu atualizei a função de mesclagem de acordo com os comentários abaixo.