如何使用点表示法删除嵌套地图中的嵌套条目

时间:2013-09-06 16:52:36

标签: java

我有一个嵌套的地图,如下所示: map.get("employee").get("address").remove("city")

有没有办法使用像“employee.address.city”这样的密钥删除城市条目?所以我正在寻找像MapUtil.remove(map,"employee.address.city")

这样的东西

3 个答案:

答案 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"));

查看更多示例https://github.com/alexheretic/dynamics

答案 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的空回报。

我不知道第三方库中有什么内容可以做到这一点 - 当然,这并不是说无处