如何将Map <String,List <Object >>流式传输到Stream <Entry <String,Object >>?

Jin*_*won 12 java query-parameters java-8 java-stream

我有一个Map<String, List<Object>>.

如何将其转换为Stream,Entry<String, Object>以便构建连接查询String

q1    a, b
q2    c, d
Run Code Online (Sandbox Code Playgroud)

q1=a&q1=b&q2=c&q2=d
Run Code Online (Sandbox Code Playgroud)

我现在正在这样做.

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;
            }
        });
    });
}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 11

好吧,你不必生产Entry<String, Object>.您可以使用flatMap获取key = value Strings并String使用Collectors.joining以下命令直接构造查询:

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

输入:

{q1=[a, b], q2=[c, d]}
Run Code Online (Sandbox Code Playgroud)

输出:

q1=a&q1=b&q2=c&q2=d
Run Code Online (Sandbox Code Playgroud)