2016-08-07 16 views
12

Tôi có Map<String, List<Object>>.Làm thế nào tôi có thể truyền một Bản đồ <String, List <Object>> vào một dòng <Entry <String, Object >>?

Tôi làm cách nào để biến nó thành Luồng Entry<String, Object> để tôi có thể tạo truy vấn được ghép nối String?

q1 a, b 
q2 c, d 

vào

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

tôi, hiện nay, làm điều này.

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

Nhận xét bên: Đừng quên UrlKích hoạt tên và giá trị của bạn khi tạo chuỗi truy vấn theo cách thủ công. – Heinzi

Trả lời

11

Vâng, bạn không phải tạo ra Entry<String, Object>. Bạn có thể sử dụng flatMap để có được chìa khóa = giá trị String s và trực tiếp xây dựng các truy vấn String sử dụng Collectors.joining:

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

Input:

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

Output:

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

Nếu bạn có Ổi , bạn có thể muốn xem xét sử dụng một số ListMultimap<String, Object> thay vì Map<String, List<Object>> và tạo chuỗi của bạn như như vậy:

String query = Joiner.on("&").withKeyValueSeparator("=").join(map.entries()); 
Các vấn đề liên quan