将映射字符串字符串转换为映射字符串列表字符串-Java 7

时间:2020-05-12 16:27:41

标签: java hibernate java-7

我有一个像下面这样的字符串字符串(List<Map<String,String>>)的映射列表,

[{key = "car", value = "bmw"},{key = "car", value = "suzuki"},{key = "car", value = "hyundai"},{key = "bike", value = "honda"},{key = "bike", value = "tvs"}]

我想转换为下面的地图字符串列表字符串(List<Map<String, List<String>>>)或类似的内容

[{key = "car", value = ["bmw","suzuki","hyundai"]},{key = "bike", value = ["honda","tvs"]}]

谢谢。

2 个答案:

答案 0 :(得分:2)

Java 8 +

对于单例地图

使用groupingBy按键分开,然后进行映射以获取单例地图的值

Map<String, List<String>> res = 
  list.stream()
    .flatMap(map -> map.entrySet().stream())
    .collect(Collectors.groupingBy(
      entry -> entry.getKey(),
      Collectors.mapping(
        entry -> entry.getValue(), 
        Collectors.toList()
      )
    )
  );

对于具有多个条目的地图

您执行与上述相同的操作,但是用flatMap来获取单个一维流中的所有条目

Map<String, List<String>> map = new HashMap<>();
for (Map<String, String> m : list) {
  for (Map.Entry<String, String> e : m.entrySet()) {
    String key = e.getKey();
    if (!map.containsKey(key)) {
      map.put(key, new ArrayList<String>());
    }
    map.get(key).add(e.getValue());
  }
}

Java 8之前的版本

对于具有多个条目的地图

您将必须遍历列表中的每个地图,然后遍历每个地图的条目。对于每个条目,请检查密钥是否已经存在,如果已存在,则将该值添加到与该密钥关联的列表中。如果该键不在结果图中,请在此处创建一个新列表。

Map<String, List<String>> map = new HashMap<>();
for (Map<String, String> m : list) {
  Map.Entry<String, String> e = m.entrySet().iterator().next();
  String key = e.getKey();
  if (!map.containsKey(key)) {
    map.put(key, new ArrayList<String>());
  }
  map.get(key).add(e.getValue());
}

对于单例地图

对于原始列表中的每个地图,找到第一个条目,然后执行与上述相同的操作:将该条目的值添加到该条目的键所映射的列表中,然后在该列表中添加一个新的List。如果密钥不存在,请映射。

function useMyCustomHook(state) {
  const { message } = state;

  const handleClick = () => {
    if(environment_variable) {
      // do something with message
    } else {
      // do something else with message 
    }
  }

  return handleClick;
}

答案 1 :(得分:0)

根据您的示例,您将获得以下地图列表:

List<Map<String,String>> myListOfMaps = List.of(
        Map.of("car", "bmw"),
        Map.of("car", "suzuki"),
        Map.of("car", "hyundai"),
        Map.of("bike", "honda"),
        Map.of("bike", "tvs")                        
);

然后,您可以使用流的groupingBy函数执行与您在下面看到的类似的事情。

流式处理列表,通过流式处理条目集来扁平化流,按键将条目集分组,映射到值列表

Map<String,List<String>> myResultMap = myListOfMaps.stream()
        .flatMap(m -> m.entrySet().stream())
        .collect(Collectors.groupingBy(
                Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

使用结果/打印..

myResultMap.forEach((k,v)-> {
    System.out.println(k + " : " + v);
});

// car : [bmw, suzuki, hyundai]
// bike : [honda, tvs]