如何将 Map<String, List<Object>> 流式传输到 Stream<Entry<String, Object>>?
How can I stream a Map<String, List<Object>> into a Stream<Entry<String, Object>>?
我有一个Map<String, List<Object>>
.
如何将它变成 Entry<String, Object>
的 Stream,以便我可以构造一个串联查询 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;
}
});
});
}
好吧,您不必生成 Entry<String, Object>
。您可以使用 flatMap
获取键=值 String
并直接使用 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
如果您有 Guava,您可能需要考虑使用 ListMultimap<String, Object>
而不是 Map<String, List<Object>>
,并像这样创建您的字符串:
String query = Joiner.on("&").withKeyValueSeparator("=").join(map.entries());
我有一个Map<String, List<Object>>
.
如何将它变成 Entry<String, Object>
的 Stream,以便我可以构造一个串联查询 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;
}
});
});
}
好吧,您不必生成 Entry<String, Object>
。您可以使用 flatMap
获取键=值 String
并直接使用 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
如果您有 Guava,您可能需要考虑使用 ListMultimap<String, Object>
而不是 Map<String, List<Object>>
,并像这样创建您的字符串:
String query = Joiner.on("&").withKeyValueSeparator("=").join(map.entries());