2016-08-07 76 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()); 
相关问题