如何流式传输Map <string,list <object =“”>&gt;进入Stream <entry <string,object =“”>&gt;?

时间:2016-08-07 10:22:48

标签: java java-8 java-stream query-parameters

我有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;
            }
        });
    });
}

2 个答案:

答案 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());