在Java8中将对象列表转换为嵌套映射

在Java8中将对象列表转换为嵌套映射,java,collections,java-8,Java,Collections,Java 8,我有一个对象列表,如下所示: Rating { Long id; String aRating; String bRating; Date date; //getters and Setters } List<Rating> list = //list with some values in it. 然后需要将其转换为以下映射: Map = {2/2/2019={aRatingEnum=A+, bRatingEnum=B+}, 2/2/2018 = {aRatingEnum=A

我有一个对象列表,如下所示:

Rating {
Long id;
String aRating;
String bRating;
Date date;

//getters and Setters
}

List<Rating> list = //list with some values in it.
然后需要将其转换为以下映射:

Map = {2/2/2019={aRatingEnum=A+, bRatingEnum=B+}, 2/2/2018 = {aRatingEnum=A, bRatingEnum=B}}
我尝试过使用java 8:

list.stream().collect(Collectors.groupingBy(x->x.getDate(), Collectors.toMap(
//here I am not able to proceed further how should I approach please help.
)))

toMap
将多个项目收集到一个集合中。您拥有的是单个对象(
评级
),并希望从中创建一个
映射

我认为您需要的是
收集,然后
,它允许您按日期分组,然后在finishing
函数
中转移到
映射

list.stream()
    .collect(Collectors.collectingAndThen(
                        Collectors.groupingBy(x->x.getDate(), 
                        lr -> {
                            Map<CustomEnum, String> result = new EnumMap<>();
                            Rating r = lr.get(0); // take first rating for that date
                            result.put(CustomEnum.aRatingEnum, r.getARating());
                            result.put(CustomEnum.bRatingEnum, r.getBRating());
                            return result;
                        })));
list.stream()
收集,收集收集,然后收集(
Collectors.groupingBy(x->x.getDate(),
lr->{
映射结果=新的EnumMap();
评级r=lr.get(0);//为该日期获得第一个评级
result.put(CustomEnum.aRatingEnum,r.getARating());
result.put(CustomEnum.bRatingEnum,r.getBRating());
返回结果;
})));
或者将lambda重构成一个方法,或者使用
Map.of
,如果您使用的是Java 9或更高版本


这将为您提供一个
映射

,但我只想要嵌套的映射而不是列表,这是不可能的吗?此外,感谢您的回复。@ghufrane创建此列表是因为您可能在每个日期有多个
评级。您必须决定如何处理多个分级。@ghufranne不在对象中,但在流式处理的列表中可能有多个同一日期的对象。但我还是犯了一个错误,我将进行编辑,让完成者只使用第一个对象。lr.get(0);错误,lr将是列表的映射,按..Enum分组的结果用于理解目的,代码未复制,
list.stream().collect(Collectors.groupingBy(x->x.getDate(), Collectors.toMap(
//here I am not able to proceed further how should I approach please help.
)))
list.stream()
    .collect(Collectors.collectingAndThen(
                        Collectors.groupingBy(x->x.getDate(), 
                        lr -> {
                            Map<CustomEnum, String> result = new EnumMap<>();
                            Rating r = lr.get(0); // take first rating for that date
                            result.put(CustomEnum.aRatingEnum, r.getARating());
                            result.put(CustomEnum.bRatingEnum, r.getBRating());
                            return result;
                        })));