如何遍历嵌套Map <Integer,List <abc >>

时间:2019-07-18 01:31:04

标签: java collections java-stream

如何遍历嵌套的Map<Integer, List<abc>>

Class Abc {
    int id ;
    String name;
    Date startDate;
    int rowNum;
}

List<Abc> dupList = list
                    .stream()
                    .collect(Collectors.groupingBy(Abc::getRowNum))
                    .values()
                    .stream()
                    .filter(v-> v.size()>=2)
                    .flatMap(List::stream)
                    .collect(Collectors.toList());
Map<Integer, List<Abc>> byRows = dupList
                                 .stream()
                              .collect(Collectors.groupingBy(Abc::getRowNum));

Map contains fallowing data
Key             value(abc List)
rowNum: 1       rowNum: 1
                startDate: 01/01/2019
                endDate:12/31/2099
                name: Test1
                Id:101
rowNum: 1       rowNum: 1
                startDate: 01/01/2020
                endDate:12/31/2099
                name: Test1
                Id:111
rowNum: 3       rowNum: 3
                startDate: 01/01/2020
                endDate:12/31/2099
                name: Test4
                Id:342
rowNum: 3       rowNum: 3
                startDate: 01/01/2020
                endDate:12/31/2099
                name: Test4
                Id:348

现在,我要为键和对应的Abc类列表打印值。

当我尝试打印地图时

Map<Integer, List<Abc>> collect = byRows
                                   .entrySet()
                                   .stream()
                                  .collect(Collectors.toMap(Map.Entry::getKey, 
                                                        Map.Entry::getValue));
System.out.println(collect);

我得到的输出为{1=[Abc@1d72673f, Abc@1cffb7e0], 3=[Abc@522530e9, Abc@58dc69f2]} 我没有从Abc类的ArrayList的嵌套循环中获取实际值。

预期输出:

I want to print startDate for each all rows 
Ex: rowNum  startDate 
    1       01/01/2019 {startDate}
            01/01/2020

    3       startDate: 01/01/2020
            startDate: 01/01/2020

2 个答案:

答案 0 :(得分:1)

基本上,您要按rowNum进行分组,如果list有2个元素,则进行过滤。因此,您可以一步一步完成所有操作。无需分组两次

Map<Integer, List<Term>> collect = list
                .stream()
                .collect(Collectors.groupingBy(Abc::getRowNum))
                .entrySet()
                .stream()
                .filter(v-> v.getValue().size()>=2)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

然后,如果要打印Map中的每个元素,然后使用forEach,仍然可能需要根据您的要求格式化数据

collect.forEach((k,v)-> {
             System.out.println("RowNum is :"+k);
             v.forEach(o->System.out.println(o.getStartDate()));
           });

答案 1 :(得分:0)

您需要重写Abc的toString()方法,当您调用“ System.out.println”时,它将调用toString()方法并返回结果。