首页 > 解决方案 > 转换多值映射到地图>.object 是List的形式

问题描述

我试图获取响应标头,其格式为MultivaluedMap<String, Object>.

对象的形式为List<String>

我想将它存储在一个Map<String, List<String>>.

有没有直接的方法可以做到这一点?

标签: javaspring-webclient

解决方案


要将MultivaluedMap转换为Map<String,List<String>>您可以执行以下操作:

首先创建一个转换List<Object>List<String>(MultivaluedMap::get return a List<Object>) 并返回 a 的方法Map<String,List<String>>(以跟踪键)

public static Map<String,List of String> convertListObjectToListofString(String k, List<Object> object) {
    
    List<String> list = object.stream()
            .flatMap(obj -> new ArrayList<String>((Collection<String>)obj).stream())
            .collect(Collectors.toList());
    
    Map<String, List<String>> map = new HashMap<String, List<String>>();

    map.put(k, list);
    
    return map;
}

之后,您可以流式传输MultivaluedMap (.entrySet().stream())并使用convertListObjectToListofString将其转换为 Map<String, List> 并重新流式传输返回的地图以将所有结果收集到一张地图中( .flatMap(eS -> convertListObjectToListofString(eS.getKey(), eS.getValue()).entrySet().stream()) .collect(Collectors.toMap(eS->eS.getKey(), eS -> eS.getValue())); )

这里所有的代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import javax.ws.rs.core.MultivaluedHashMap;
import javax.ws.rs.core.MultivaluedMap;

public class MapObjectToStringList {
    
    public static void main(String[] args) {
        
        List<String> list1 = new ArrayList<>(Arrays.asList("a","b","c"));
        List<String> list2 = new ArrayList<>(Arrays.asList("d","e","f"));
        List<String> list3 = new ArrayList<>(Arrays.asList("g","h","i"));
        List<String> list4 = new ArrayList<>(Arrays.asList("j","k","l"));
        
        MultivaluedMap<String, Object> map = new MultivaluedHashMap<String, Object>();
        
        map.add("aa", list1);
        map.add("bb", list2);
        map.add("cc", list3);
        map.add("dd", list4);
        
        Map<String, List<String>> collect = map.entrySet().stream()
                .flatMap(eS ->convertListObjectToListofString(eS.getKey(), eS.getValue()).entrySet().stream())
                .collect(Collectors.toMap(eS->eS.getKey(), eS -> eS.getValue()));
        
        System.out.println(collect);

    }
    
    public static Map<String,List<String>> convertListObjectToListofString(String k, List<Object> object) {
        
        List<String> list = object.stream()
                .flatMap(obj -> new ArrayList<String>((Collection<String>)obj).stream())
                .collect(Collectors.toList());;
        
        Map<String, List<String>> map = new HashMap<String, List<String>>();
    
        map.put(k, list);
        
        return map;
    }
}

PS:

此代码使用 java 8 运行,我将 javax.ws.rs-api-2.0.jar 添加到我的项目中


推荐阅读