2017-06-22 3 views
0

Je suis impatient de convertir une liste à une carteDe Liste d'un objet aux objets du groupe avec sa clé et des valeurs basées sur Java 8 ou goyave

List<Element> à une carte de Map<String,List<Element>

élément classe contient clés et des valeurs

public class Element { 

public Element(final key, final value) { 
     this((Object) key, (Object) value, 1L); 
    } 
public final Object getObjectKey() { 
     return key; 
    } 
public final Object getObjectValue() { 
     return value; 
    } 
} 

La façon dont j'ajouter des éléments est comme

empRepository.save(new Element(empKey, empTransaction)); 

Le empKey est un objet de classe EmpKey

public class EmpKey{ 

private String employeeId; 
private String tenantId; 
//Getters & Setters 
} 

Dans une autre classe la méthode groupElementsByEmployeeId essayant de convertir les paramètres des éléments de la collection à une carte

public void groupElementsByEmployeeId(Collection<Element> elements){ 

List<Element> to a map of Map<String,List<Element> 

where Map key String is tenantId which is in EmpKey 

} 

Pour regrouper tous les éléments à base sur TenantID Ce qui est une propriété de EmpKey

EmpKey est la clé pour l'élément

//List<Element> to a map of Map<String,List<Element> 

// where Map key String is tenantId which is in EmpKey 

Quelque chose que je commencé, mais ne savent pas comment obtenir la sortie je cherche

elements.stream().collect(Collectors.groupingBy(Element::getObjectKey)) 

I have to cast groupingBy(Element::(EmpKey)getObjectKey.getTenantId)) 
+0

Comme vous pensez déjà à l'utilisation de Goya, remplacez «Carte » par l'un des Gava ['ListMultimap '] (https://google.github.io/guava/releases/17.0/api/docs/ com/google/common/collect/ListMultimap.html) implémentations. – Robert

+0

J'ai fini de lire votre "question" - mais il me manque ce que vous demandez. Veuillez le modifier et ajouter quel est votre problème. – Robert

+0

Comment puis-je faire le regroupement parce que la clé pour la carte est l'attributenantId qui est un attribut pour EmpKey. EmpKey est la clé pour Element –

Répondre

3

Je pense que vous êtes près. Je voudrais juste faire:

Map<String, List<Element>> map = elements.stream() 
    .collect(Collectors.groupingBy(e -> ((EmpKey) e.getObjectKey()).getTenantId())); 
1

Vous voulez vraiment utiliser Multimap (plus particulièrement ListMultimap) ici. Il s'agit essentiellement d'une carte des clés pour la collecte des valeurs, pour une description plus détaillée s'il vous plaît lire this wiki page.

Dans votre cas, vous pouvez utiliser la méthode Multimaps.index qui fait exactement ce que vous voulez:

ListMultimap<String, Element> multimap = 
    Multimaps.index(elements, e -> ((EmpKey) e.getObjectKey()).getTenantId()); 

// get your elements under a key: 
List<Element> elements = multimap.get("someTenantId"); 

// view Multimap as plain Map 
Map<String, Collection<Element>> mapOfCollections = multimap.asMap(); 
Map<String, List<Element>> mapOfLists = Multimaps.asMap(multimap); 

Sans utiliser goyave, vous pouvez utiliser Collectors.groupingBy, voir la réponse de Federico Peralta Schaffner.