使用 Java 8 个流使用地图列表构建新地图

Construct a new map using List of Maps using Java 8 streams

我将下面的 json 数据(在示例中)转换为 List> 并且我想从中使用 Java 8 个流构建一个新的 Map 并且输出应该看起来像下面。有人可以帮我解决这个问题吗?

Key         value
Service1: DEACTIVATED
Service2: ACTIVATED
Service3: DEACTIVATED

例如:

[
{
 name=Service1, 
 desiredState=DEACTIVATED
}, 
{
 name=Service2, 
 desiredState=ACTIVATED
}, 
{
  name=Service3, 
  desiredState=DEACTIVATED
}
]

据我了解,您的目标是将 List> 转换为 Map

 List<Map<String,String>> myMap = .... // map which you have already.
    
    Map<String,String> resultMap = myMap.stream()
                                   .flatMap(map ->  map.entrySet().stream())  // Get a flatMap of the entryset. This will form a stream of Map.Entry
                                   .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue(), (k1, k2) -> k2));

这里 (k1,k2) -> k2 是一个合并函数,以防在构建 resultMap 时相同键有多个条目。

如果我做得好,您需要以某种方式合并您的地图,使 name 键的值是映射到 desiredState 键的值的键。你可以这样做:

Map<String, String> result = listOfMaps.stream()
    .collect(Collectors.toMap(
             m -> m.get("name"),
             m -> m.get("desiredState"),
             (o, n) -> n));

这假设列表中的所有地图都有 namedesiredState 条目。必须提供 (o, n) -> n 合并功能,以防在创建 result 映射时发生冲突(即具有相同键的条目)。在这里,在旧值和新值之间,我选择了新值。