我有Map<String, List<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;
}
});
});
}
答案 0 :(得分:11)
好吧,你不必生成Entry<String, Object>
。您可以使用flatMap
获取key = value String
并使用String
直接构建查询Collectors.joining
:
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
答案 1 :(得分:3)
如果你有Guava,你可能想考虑使用ListMultimap<String, Object>
而不是Map<String, List<Object>>
,并像这样创建你的字符串:
String query = Joiner.on("&").withKeyValueSeparator("=").join(map.entries());