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

时间:2019-06-24 10:52:04

标签: 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<Date, Map<CustomEnum, String>> 


Enum CustomEnum {

     aRatingEnum("aRating", "someValue");
     bRatingEnum("bRating", "someValue");

   }

假设列表包含以下值:

Id, Date, aRating, bRating
1 , 2/2/2019, A+, B+
2, 2/2/2018, A, B

然后需要将其转换为以下地图:

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

1 个答案:

答案 0 :(得分:1)

toMap将多个项目收集到一个集合中。您只有一个对象(Rating),并想从中创建一个Map

我认为您想要的是collectingAndThen,它允许您按日期分组,然后在完成Map时转移到Function

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

或者将该lambda重构为方法,或者,如果您使用的是Java 9或更高版本,请使用Map.of

这会给你一个Map<Date, Map<CustomEnum, String>>