将 Map<String, String[]> 转换为 MultiValueMap<String, String>

Convert a Map<String, String[]> to a MultiValueMap<String, String>

我有以下内容;

Map<String, String[]> params = getSrcMap();

我需要转换为 MultiValueMap 。我尝试过:

MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<String, String[]>(params);

无法按书面方式解析(不编译)。感谢您的想法。谢谢

您可以将 Map<String, String[]> 转换为 Map<String, List<String>>,这样它就可以直接传递给 LinkedMultiValueMap 的构造函数。

MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>(
       params.entrySet().stream().collect(
          Collectors.toMap(Map.Entry::getKey, e -> Arrays.asList(e.getValue()))));

copy constructor 期望值类型是列表,而不是数组。您需要先转换地图。这是一种使用流的方法:

Map<String, List<String>> params = getSrcMap()
        .entrySet()
        .stream()
        .collect(Collectors.toMap(Entry::getKey, e -> Arrays.asList(e.getValue())));

或者,如果您有像 Guava 这样的库,您可以使用函数转换地图:

Map<String, List<String>> params = Maps.transformValues(getSrcMap(), Arrays::asList);

或者只创建一个空地图并手动填充它:

MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
getSrcMap().forEach((key, values) -> {
    for (String value : values) {
        multiValueMap.put(key, value);
    }
});

非常简单,代码甚至不需要 Java 8 个流:

MultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
for (Entry<String, String[]> entry : params.entrySet())
    multiValueMap.put(entry.getKey(), Arrays.asList(entry.getValue()));