使用Java 8 lambda将列表映射转换为不同的Map

时间:2016-07-15 02:15:27

标签: java lambda 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())

有人可以指导我吗?另一种方法是使用常规for循环,但我正在尝试使用lambdas。

2 个答案:

答案 0 :(得分:5)

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

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

如果&#34; ID&#34;这将引发异常。是重复的。有重载方法可以让您更好地控制此行为。

答案 1 :(得分: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")));

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