2017-02-27 115 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