我有一个嵌套地图,如下所示:
map.get("employee").get("address").remove("city")
有没有办法使用“employee.address.city”之类的键删除城市条目?所以我正在寻找类似的东西MapUtil.remove(map,"employee.address.city")
我有一个嵌套地图,如下所示:
map.get("employee").get("address").remove("city")
有没有办法使用“employee.address.city”之类的键删除城市条目?所以我正在寻找类似的东西MapUtil.remove(map,"employee.address.city")
Java 8 库Dynamics可以做到这一点,它包装了一个嵌套的映射/集合(以及其他类型)结构,并允许在没有静态类型的情况下进行空安全推理。
Dynamic.from(map).get("employee").get("address").asMap().remove("city");
我们包装地图以获取我们的 Dynamic 实例,#get 现在返回代表孩子的其他 Dynamic 实例,或者该孩子不存在。因此,这是 null 安全的。
为方便起见,我们还可以使用 #dget 将一个 get 拆分为多个,也许还可以使用 #maybe 来处理员工或地址一律不存在的情况:
Dynamic.from(map).dget("employee.address")
.maybe().asMap()
.ifPresent(address -> address.remove("city"));
不是本地的,不,尽管您可以自己编写一个使用 解析扩展映射键的方法String.split("\\.")
,如下所示:
public void nestedRemove(Map map, String keyToRemove)
{
String string = "employee.address.city";
String[] keys = string.split("\\.");
Map subMap = null;
for(int i = 0; i < keys.length -1; i++)
{
subMap = subMap.get(keys[i]);
}
subMap.remove(keys[i]);
}
您可以编写自己的方法来执行此操作,尽管您可能不得不求助于相当多的强制转换。您可能只是按点拆分,然后继续调用get
(并记住下一步的结果),直到到达最后一部分,此时您将remove
改为调用...记住从get
at检查是否有 null 返回每一步。
我不知道第三方库中有什么东西可以做到这一点——当然,这并不是说它无处可去。