2016-08-07 52 views
12

Ich habe eine Map<String, List<Object>>.Wie kann ich eine Map <String, Liste <Object>> in einen Stream streamen <Entry <String, Object >>?

Wie kann ich es in einen Stream von Entry<String, Object> machen, so dass ich eine verkettete Abfrage erstellen kann String?

q1 a, b 
q2 c, d 

in

q1=a&q1=b&q2=c&q2=d 

ich, zur Zeit, dies zu tun.

if (params != null && !params.isEmpty()) { 
    final boolean[] flag = new boolean[1]; 
    params.forEach((n, vs) -> { 
     vs.forEach(v -> { 
      builder.append(flag[0] ? '&' : '?') 
        .append(n) 
        .append('=') 
        .append(v); 
      if (!flag[0]) { 
       flag[0] = true; 
      } 
     }); 
    }); 
} 
+2

Nebenbemerkung: Vergessen Sie nicht, Ihre Namen und Werte beim Erstellen der Abfragezeichenfolge manuell zu urlEncodieren. – Heinzi

Antwort

11

Nun, Sie müssen keine Entry<String, Object> produzieren. Sie können flatMap verwenden, um die Schlüssel = Wert String s zu erhalten und die Abfrage direkt konstruieren StringCollectors.joining mit:

String query = 
    map.entrySet() 
     .stream() 
     .flatMap(e -> e.getValue().stream().map(v -> e.getKey() + '=' + v)) 
     .collect(Collectors.joining("&")); 

Eingang:

{q1=[a, b], q2=[c, d]} 

Ausgang:

q1=a&q1=b&q2=c&q2=d 
3

Wenn Sie Guava Vielleicht möchten Sie die Verwendung eines ListMultimap<String, Object> anstelle von Map<String, List<Object>> in Erwägung ziehen und Ihre Zeichenfolge wie erstellen so: