2016-08-07 77 views
12

我有一個Map<String, List<Object>>如何將Map <String,List <Object>>流式傳輸到Stream <Entry <String,Object >>?

我怎樣才能把它變成流Entry<String, Object>,以便我可以構造一個連接查詢String

q1 a, b 
q2 c, d 

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

我,目前這樣做。

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

備註:當手動構建查詢字符串時,不要忘記UrlEncode您的名字和值。 – Heinzi

回答

11

那麼,你不必產生一個Entry<String, Object>。您可以使用flatMap獲得密鑰=值String S和直接使用Collectors.joining構造查詢String

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

輸入:

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

輸出:

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

如果你有番石榴,你可能要考慮使用ListMultimap<String, Object>而不是Map<String, List<Object>>,並創建你喜歡的字符串所以:

String query = Joiner.on("&").withKeyValueSeparator("=").join(map.entries()); 
相關問題