从对象列表到组对象及其键和基于Java 8或Guava的值

时间:2017-06-22 16:57:12

标签: java lambda java-8 guava

我期待将列表转换为地图

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

2 个答案:

答案 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的答案。