【问题标题】:Convert a map to list of map将地图转换为地图列表
【发布时间】:2018-11-13 11:54:11
【问题描述】:

我有一个要求,我想将地图转换为地图列表。

我试过下面的代码,

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

有什么方法可以修改java 8风格的以下代码:

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

【问题讨论】:

  • 如果你发现自己在写Map&lt;String,Object&gt;,你通常应该改用List or Set&lt;MyClass&gt;class MyClass { private int pid; private List&lt;Category&gt; categories; }。你的代码看起来很丑,因为它是stringly typed

标签: java java-8 java-stream collectors


【解决方案1】:

将 for-loop-content 放入一个函数中并与流一起使用:

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

【讨论】:

    【解决方案2】:

    你可以这样做,

    List<Map<String, Object>> result = categoriesByProduct.entrySet().stream()
        .map(e -> Stream
            .of(new AbstractMap.SimpleEntry<String, Object>("pid", e.getKey()),
                new AbstractMap.SimpleEntry<String, Object>("categories", e.getValue()))
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)))
        .collect(Collectors.toList());
    

    【讨论】:

      猜你喜欢
      • 2020-07-06
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      相关资源
      最近更新 更多