我有以下代码块,要将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
答案 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
。)