2016-07-15 52 views
0

我就是喜欢这样的数据:使用Java 8拉姆达转换列表中映射到不同的地图

List<Map<String, String>> = // psuedocode 
[ 
{ 
    "ID": "a", 
    "Value": "val1" 
}, 
{ 
    "ID": "b", 
    "Value": "val2" 
}, 
] 

我想打开这

Map<String, String> = // more pseudocode 
{ 
"a": "val1", 
"b": "val2" 
} 

我有这样的事情至今:

Map<String, String> output = myList.stream() 
      .flatMap(m -> m.entrySet().stream()) 
      .collect(Collectors.toMap()) 

有人能指导我吗?另一种方法是使用常规循环,但我试图使用lambdas。

+1

而不是伪代码,如果你能想出一个[mcve]会有帮助。这将阻止其他人不得不重复创建一个小测试。事实上,你的代码到目前为止没有引用“ID”或“值”有点令人惊讶......听起来你应该将每个Map 映射到一个单一的键值对中... –

回答

5

您需要将列表中的每个Map实例映射到密钥和值,然后收集到单个Map实例中。

Map<String, String> output = myList.stream() 
    .collect(Collectors.toMap(m -> m.get("ID"), m -> m.get("Value"))); 

如果“ID”重复,这将引发异常。有重载的方法可以让你更好地控制这种行为。

0

而上述方案是伟大的,我得到的结果如下:

//declared a result map 
Map<String, String> result = new ConcurrentHashMap<String, String>(); 

list.parallelStream().forEach(m -> result.put(m.get("id"), m.get("value"))); 

您可以在并发处理的情况下是安全的。