2017-06-22 37 views
0

我期待着到一個列表轉換成地圖從對象到基於Java 8或番石榴

List<Element>到地圖Map<String,List<Element>

其鍵和值組對象的列表類包含鍵和值

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; 
    } 
} 

我的方式添加元素就像

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

的empKey是類的一個對象EmpKey

public class EmpKey{ 

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

在另一個類中的方法groupElementsByEmployeeId試圖那些集合元素參數轉換爲地圖

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 

} 

要組中的所有元素的基於on tenantId這是EmpKey的財產

EmpKey是元素的關鍵

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

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

東西,我開始了,但不知道如何讓我期待的輸出

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

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

正如你已經考慮使用番石榴取代'Map ''與Guava的一個['ListMultimap ''(https://google.github.io/guava/releases/17.0/api/docs/) com/google/common/collect/ListMultimap.html)實現。 – Robert

+0

我讀完了你的「問題」 - 但是我錯過了你要求的東西。請編輯它並添加您的問題。 – Robert

+0

我如何做分組,因爲map的鍵是tenantId,這是EmpKey的一個屬性。 EmpKey是元素的關鍵 –

回答

3

我認爲你靠近。我只想做:

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

你真的想在這裏使用Multimap(更具體ListMultimap)。它基本上是一個收集值的鍵的地圖,更詳細的說明請參閱this wiki page

你的情況,你可以使用Multimaps.index方法,不正是你想要什麼:

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); 

不使用番石榴,你可以使用Collectors.groupingBy,看到費德里科·佩拉爾塔夏弗納的答案。