lista um grupo de triplos em mapa com chave par

folhosos:

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 valuedo mapa é o terceiro elemento do triplo. E no caso do mesmo keydeve 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 8e sua groupingem correntes?

Ravindra Ranwala:

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 HashMapusos classe equalsmétodo para identificar objetos-chave única. Então, primeiro você precisa para substituir equalse hashcodemétodos para mostrar a igualdade lógica dos Pairobjetos para a Mapclasse.

Em seguida, voltar para os córregos e lambda. Para cada utilização tripleto Collectors.toMapcom o Pairobjecto que a chave e o outro valor remanescente do Tripletque o valor. Em seguida, forneça um mergeFunctionpara 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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=224679&siteId=1
Recomendado
Clasificación