Search code examples
javajava-8java-streamcollectors

Convert a map to list of map


I have a requirement where i want to convert a map into list of map.

I tried the following code,

List<Map<String, Object>> response = new ArrayList<>();
Set<Long> categories = new HashSet<>();

List<CCP> ccpList = ccpRepository.findByPIdIn(ids);
Map<Integer, List<Integer>> categoriesByProduct = ccpList.stream()
                  .collect(Collectors.groupingBy(ccp -> ccp.getPId(), Collectors.mapping(ccp-> ccp.getCId(), Collectors.toList())));
for(Entry<Integer, List<Integer>> en : categoriesByProduct.entrySet()) {
    Map<String,Object> responseObject = new HashMap<>();
    responseObject.put("pid", en.getKey());
    responseObject.put("categories",en.getValue());
    response.add(responseObject);
}

Is there any way in which i can modify the following code in java 8 style:

for(Entry<Integer, List<Integer>> en : categoriesByProduct.entrySet()) {
    Map<String,Object> responseObject = new HashMap<>();
    responseObject.put("pid", en.getKey());
    responseObject.put("categories",en.getValue());
    response.add(responseObject);
}

Solution

  • Put the for-loop-content in a function and use it with streams:

    response = categoriesByProduct.entrySet()
                                  .stream()
                                  .map(e -> toMap(e))
                                  .collect(Collectors.toList());
    
    public static Map<String, Object> toMap(Map.Entry<Integer, List<Integer>> en) {
        Map<String,Object> responseObject = new HashMap<>();
        responseObject.put("pid", en.getKey());
        responseObject.put("categories",en.getValue());
        return responseObject;
    }