将List <Map>转换为List <Map <String,Object >>

时间:2019-07-16 12:03:52

标签: java

我有以下代码块,要将Map转换为Map<String,Object>。有没有更好的方法可以完成我要达到的目标

// users -> List<Map> 
List<Map<String, Object>> updatedUsers = new ArrayList<>();
for (Map user : users) {
user.put(enclosedListName, removeFromList(data, (List<Map<String, Object>>) user.get(enclosedListName)));
updatedUsers.add(user);   
}
someMethod(updatedUsers); //method expects List<Map<String,Object>>, how can i use users directly instead of updatedUsers

1 个答案:

答案 0 :(得分:0)

您可能想使用流(或者您可能不想要!)。

但是,主要问题是Object。通常,避免丢失以后将需要的静态类型信息。

我们有List<Map<String, Object>>。假设List的每个元素可以具有不同参数化的Map。根据您要对Map进行的操作,有不同的选择。

如果只是在地图中移动元素和某些常用方法,则可以使用Map<String, ? extends Common>并捕获该通配符:

// Will accept Map<String, ?>
static <T> void swapAB(Map<String, T> map) {
    // Odd behaviour involving nulls for this code - ignore that.
    T a = map.get("A");
    T b = map.get("B");
    map.put("A", a);
    map.put("B", b);
}

或者,您可以将Map包装在另一个包含客户端所需的所有方法的对象中。

interface UpdatedUser {
    public void fn(Blah blah);
    public void gn(Donkey donkey);
}

public static UpdateUser barUpdateUser(Map<String, Bar> map) {
    return new UpdatedUser {

        public void fn(Blah blah) {
            // Can  happily operate on map values.
        };
        public void gn(Donkey donkey) {
        }
    };
}

如果您需要实际值并且有固定的可能性,则可以执行一种切换(退化的访问者)。

interface UpdateUserSwitch {
    void bar(Map<String,Bar> bars);
    void foo(Map<String,Foo> foos);
}

UpdatedUser中:

void swtch(UpdateUserSwitch swtch);

在该匿名内部类中

public void swtch(UpdateUserSwitch swtch) {
    swtch(map);
}

(如果需要,您可以添加一个返回类型参数代替void。)