列出<Object>到Map <String,Map <String,List <Object >>>

Ram*_*Ram 12 java collections list hashmap java-8

我有List<Person>哪里Person如下是.

class Person {

    String personId;
    LocalDate date;
    String type;

    // getters & setters

}
Run Code Online (Sandbox Code Playgroud)

我试图将其转换为List<Person>Map<String, Map<LocalDate,List<Person>>>地方外映射的关键是personId和内部地图的关键是date,我无法弄清楚如何实现这一目标.到目前为止,尝试过如下所示的内容 也可以使用Java 8解决方案.

Map<String,Map<LocalDate,List<Person>>> outerMap = new HashMap<>();
Map<LocalDate,List<Person>> innerMap = new HashMap<>();

for(Person p : list) {
    List<Person> innerList = new ArrayList<>();
    innerList.add(p);
    innerMap.put(p.getDate(), innerList);
    outerMap.put(p.getPersonId(), innerMap);
}
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 17

list.stream()
    .collect(Collectors.groupingBy(
        Person::getPersonId,
        Collectors.groupingBy(
            Person::getDate
)));
Run Code Online (Sandbox Code Playgroud)


Fed*_*ner 7

这个答案显示了如何使用流来完成它,另一个如何使用传统的迭代方法来完成它.这是另一种方式:

Map<String, Map<LocalDate, List<Person>>> outerMap = new HashMap<>();
list.forEach(p -> outerMap
        .computeIfAbsent(p.getPersonId(), k -> new HashMap<>()) // returns innerMap
        .computeIfAbsent(p.getDate(), k -> new ArrayList<>())   // returns innerList
    .add(p)); // adds Person to innerList
Run Code Online (Sandbox Code Playgroud)

这用于Map.computeIfAbsent创建一个新的innerMap并将其放在outerMapif not present(关键是personId)中,并且还创建一个new innerList并将其放入innerMapif if not present(关键字date).最后,Person添加到了innerList.

  • 很高兴知道`Map.computeIfAbsent`.谢谢费德里科! (2认同)