我期待将列表转换为地图
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;
}
}
我添加Elements的方式就像
empRepository.save(new Element(empKey, empTransaction));
empKey是EmpKey类的对象
public class EmpKey{
private String employeeId;
private String tenantId;
//Getters & Setters
}
在另一个类中,方法groupElementsByEmployeeId尝试将这些Collection elements参数转换为map
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
}
根据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 :(得分:3)
我认为你就在附近。我会这样做:
Map<String, List<Element>> map = elements.stream()
.collect(Collectors.groupingBy(e -> ((EmpKey) e.getObjectKey()).getTenantId()));
答案 1 :(得分: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
,请参阅Federico Peralta Schaffner的答案。