1

次のようなネストされたマップがあります。 map.get("employee").get("address").remove("city")

「employee.address.city」のようなキーを使用して都市のエントリを削除する方法はありますか? だから私は次のようなものを探していますMapUtil.remove(map,"employee.address.city")

4

3 に答える 3

5

Java 8 ライブラリDynamicsはこれを行うことができ、ネストされたマップ/コレクション (他の型の中で) 構造をラップし、静的型付けなしで null セーフな推論を可能にします。

Dynamic.from(map).get("employee").get("address").asMap().remove("city");

動的インスタンスを取得するためにマップをラップします。#get は、子を表す他の動的インスタンス、またはその子の不在を返します。そのため、これはヌルセーフです。

便宜上、#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、最後の部分に到達するまで呼び出しを続けます (次のステップの結果を記憶します)。その時点で、代わりに呼び出します... atremoveからの null 戻り値を確認することを忘れないでください。get全段階で。

これを行うためにサードパーティのライブラリに組み込まれているものは何も知りません-もちろん、どこにもないと言っているわけではありません。

于 2013-09-06T16:55:32.340 に答える