2017-02-27 117 views
2

我查询数据库中的两列,其中第一列是第二列的关键字。 如何将结果列表转换为单个地图? 它甚至有可能吗?我刚刚看到了豆类的例子。通过流将映射列表转换为单个映射

List<Map<String, Object>> steps = jdbcTemplate.queryForList("SELECT key, value FROM table"); 

// well this doesn't work 
Map<String, String> result = steps.stream().collect(Collectors.toMap(s -> s.get("key"), s -> s.get("value"))); 

回答

4

你忘了转换您的键和值映射到生产String

final Map<String, String> result = steps 
       .stream() 
       .collect(Collectors.toMap(s -> (String) s.get("key"), s -> (String) s.get("value"))); 

完整的示例

public static void main(String[] args) { 
    final List<Map<String, Object>> steps = queryForList("SELECT key, value FROM table"); 
    final Map<String, String> result = steps 
      .stream() 
      .collect(Collectors.toMap(s -> (String) s.get("key"), s -> (String) s.get("value"))); 
    result.entrySet().forEach(e -> System.out.println(e.getKey() + " -> " + e.getValue())); 
} 

private static List<Map<String, Object>> queryForList(String s) { 
    final List<Map<String, Object>> result = new ArrayList<>(); 

    for (int i = 0; i < 10; i++) { 
     final Map<String, Object> map = new HashMap<>(); 
     map.put("key", "key" + i); 
     map.put("value", "value" + i); 
     result.add(map); 
    } 

    return result; 
} 

它打印

key1 -> value1 
key2 -> value2 
key0 -> value0 
key5 -> value5 
key6 -> value6 
key3 -> value3 
key4 -> value4 
key9 -> value9 
key7 -> value7 
key8 -> value8 
+0

可惜这不是去上班。 你忘记它的地图列表, 它会导致显示java.lang.NullPointerException 试图使用你确切的代码 – Lenar

+0

它为我 – user489872

+0

s.get的演员(“密钥”)是没有必要的 – user489872

0

的问题是你有一个李st地图。下面的代码应工作:

Map<String, String> result = new HashMap<>(); 
steps.stream().forEach(map -> { 
    result.putAll(map.entrySet().stream() 
     .collect(Collectors.toMap(entry -> entry.getKey(), entry -> (String) entry.getValue()))); 
}); 

如果我们尝试运行这个例子

Map<String, Object> steps1 = new HashMap<>(); 
steps1.put("key11", "value11"); 
steps1.put("key12", "value12"); 

Map<String, Object> steps2 = new HashMap<>(); 
steps2.put("key21", "value21"); 
steps2.put("key22", "value22"); 

List<Map<String, Object>> steps = new ArrayList<>(); 
steps.add(steps1); 
steps.add(steps2); 

Map<String, String> result = new HashMap<>(); 
steps.stream().forEach(map -> { 
    result.putAll(map.entrySet().stream() 
     .collect(Collectors.toMap(entry -> entry.getKey(), entry -> (String) entry.getValue()))); 
}); 
System.out.println(result); 

它高兴地给了我们这样的输出:

{key12=value12, key11=value11, key22=value22, key21=value21} 
+0

这并不是OP询问的情况。他有一张代表数据库数据的地图列表。有2列:'key'和'value',因此该列表中的每个映射将只有一个2个条目(一个用于“key”'键,另一个用于''value''键)。而且,顺便说一句,在你的结果图中没有值,只有映射到键的键,这是没有意义的。 – esin88

+0

你是对的,但只在关键部分 ...修复 – Lenar

+0

双重检查你的“完整例子”。是的,它可以工作,但我没有尝试。 它只能用于这个确切的情况,所以我的道歉 我建议的方法将适用于任何地图列表。 – Lenar