如何遍历嵌套的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
答案 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()方法并返回结果。