Tengo una lista de triples
List<Triple<String, String, String>> triplets;
Quiero grupo en un mapa como éste
Map<Pair<String, String>, String> mapping;
Donde value
el mapa es el tercer elemento del triple. Y en el caso de la misma key
se debe anular el tercer valor restante.
Por ejemplo
def triples = [ {a, b, c} ; {a, d, e} ; {a, b, f } ]
// grouping
def map = [ {a,b} : c ; {a, d} : e ]
¿Cómo hacer que el uso Java 8
y su grouping
en corrientes?
Esto debería funcionar:
Map<Pair<String, String>, String> result = triplets.stream()
.collect(
Collectors.toMap(
t -> new Pair(t.getOne(), t.getTwo()),
Triple::getThree,
(v1, v2) -> v2
)
);
Ejemplo de una clase 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);
}
}
La HashMap
usos clase equals
método para identificar objetos clave única. Así que primero tiene que anular equals
y hashcode
métodos para mostrar la igualdad lógica de los Pair
objetos de la Map
clase.
A continuación, volver a los arroyos y lambda. Para cada uso triplete Collectors.toMap
con el Pair
objeto como la clave y el otro valor restante de la Triplet
como el valor. A continuación, proporcionan una mergeFunction
para manejar conflictos de clave. En su caso, usted necesita para mantener el valor anterior, pero liberada nuevo valor. Eso es todo lo que necesita hacer.
Actualizar
He actualizado la función de combinación de acuerdo con los comentarios a continuación.