2017-02-27 8 views
2

Ich frage die DB nach zwei Spalten, wobei die erste der Schlüssel zu der zweiten ist. Wie kann ich die resultierende Liste in eine einzelne Karte konvertieren? Ist es überhaupt möglich? Ich habe gerade Beispiele mit Bohnen gesehen.Konvertieren von Karten in einzelne Karten über Streams

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"))); 

Antwort

4

Sie haben vergessen, Ihren Schlüssel und Werte-Mappings zu konvertieren String zu produzieren:

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

Voll Beispiel

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; 
} 

Welche

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

leider würde es nicht. Sie vergessen haben, es ist eine Liste von Karten, Es verursacht java.lang.NullPointerException Versuchte Ihre genauen Code zu verwenden – Lenar

+0

Es funktionierte für mich – user489872

+0

die Besetzung von s.get („Schlüssel“) ist notwendig, nicht – user489872

0
druckt

Das Problem ist, Sie haben ein li st Karten. Der folgende Code sollte funktionieren:

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()))); 
}); 

Wenn wir versuchen, dieses Beispiel

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); 

Es gibt uns glücklich die Ausgabe so zu laufen: arbeiten

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

Das ist nicht der Fall, nach dem OP gefragt hat. Er hat eine Liste von Karten, die Daten aus der Datenbank darstellen. Es gibt zwei Spalten: 'key' und' value', so dass jede Karte in dieser Liste nur einen 2 Einträge hat (einen für 'key'-Schlüssel und einen für' value_ 'key). Und außerdem, in Ihrer Ergebniskarte gibt es keine Werte, nur Schlüssel, die Schlüsseln zugeordnet sind, was keinen Sinn macht. – esin88

+0

Sie haben Recht, aber nur in dem Teil über Tasten ... Befestigung – Lenar

+0

überprüfen Sie Ihr "vollständiges Beispiel". Ja, es kann funktionieren, aber ich habe es nicht versucht. kann es nur für diesen genauen Fall funktionieren, also meine Entschuldigungen Der Ansatz, den ich vorgeschlagen habe, funktioniert für jede Liste von Karten. – Lenar

Verwandte Themen