我有一个嵌套的地图,如下所示:
map.get("employee").get("address").remove("city")
有没有办法使用像“employee.address.city”这样的密钥删除城市条目?所以我正在寻找像MapUtil.remove(map,"employee.address.city")
答案 0 :(得分:3)
Java 8库Dynamics可以执行此操作,它包装嵌套的地图/集合(以及其他类型)结构,并允许无需静态类型的空安全推理。
Dynamic.from(map).get("employee").get("address").asMap().remove("city");
我们将地图包装起来以获取我们的动态实例,#get现在返回表示子项的其他动态实例,或者不存在该子项。因此,这是无效的。
为方便起见,我们也可以使用#dget将一个get into分成多个,也许#maybe可以处理员工或地址毫无例外地存在的情况:
Dynamic.from(map).dget("employee.address")
.maybe().asMap()
.ifPresent(address -> address.remove("city"));
答案 1 :(得分:1)
不是原生的,不是,尽管你可以自己编写一个使用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]);
}
答案 2 :(得分:0)
你可以编写自己的方法来做到这一点,尽管你可能不得不求助于相当数量的演员。您可能只是分开点,然后继续调用get
(并记住下一步的结果),直到您到达最后一部分,此时您将调用remove
。记得在每一步都检查get
的空回报。
我不知道第三方库中有什么内容可以做到这一点 - 当然,这并不是说无处。