1

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

有没有办法使用“employee.address.city”之类的键删除城市条目?所以我正在寻找类似的东西MapUtil.remove(map,"employee.address.city")

4

3 回答 3

5

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

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

于 2016-10-12T17:01:30.940 回答
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]);
}
于 2013-09-06T16:55:49.977 回答
0

您可以编写自己的方法来执行此操作,尽管您可能不得不求助于相当多的强制转换。您可能只是按点拆分,然后继续调用get(并记住下一步的结果),直到到达最后一部分,此时您将remove改为调用...记住从getat检查是否有 null 返回每一步。

我不知道第三方库中有什么东西可以做到这一点——当然,这并不是说它无处可去

于 2013-09-06T16:55:32.340 回答