Отображение вложенных списков на вложенные карты в Java 8 - PullRequest
2 голосов
/ 31 января 2020
FamilyLegacy
   ParentList<Parent>

Parent //(Obj Class)
   ParentId // String ID
   ChildList<Child>  // List

Child
   ChildId
   GrandChildList<GrandChild>

GrandChild
    GrandChildId
   // Some GrandChild attribs    



{
  "parents": [
    {
      "Id": "P1",
      "parentName": "BigBob",
      "Child": [
        {
          "id": "C1",
          "name": "BOB",
          "grandChild": [
            {
              "grandChildId": "G1",
              "grandChildName": "John"
            },
            {
              "grandChildId": "G2",
              "grandChildName": "Doe"
            }
          ]
        },
        {
          "id": "C2",
          "name": "Marley",
          "grandChild": [
            {
              "grandChildId": "G3",
              "grandChildName": "Katty"
            },
            {
              "grandChildId": "G4",
              "grandChildName": "Perry"
            }
          ]
        }
      ]
    }
  ]
}

Выходы в ->

{
  "P1": {
    "name": "BigBob",
    "C1": {
      "name": "Bob",
      "G1": {
        "name": "John"
      },
      "G2": {
        "name": "Doe"
      }
    },
    "C2": {
      "name": "Marey",
      "G3": {
        "name": "Katty"
      },
      "G4": {
        "name": "Parry"
      }
    }
  }
}

Рассмотрим вышеупомянутый вложенный объект в структуру списка. Есть ли способ преобразовать эту структуру во вложенную карту, такую ​​как

 Map<String,Map<String, Map<String,Map<String,GrandChild>>>>
ParentId -> map of Parents ->map of childs ->map of grand childs  keyed with respective IDs

Например, отображение первого уровня

  Map<String, Parent> parentMap =
    FamilyLegacy.getParents().stream().collect(
                   Collectors.toMap(Parent::getParentId,Function.identity()));

Мне трудно визуализировать отображение и вложение, признателен, если есть способ сделать это с помощью прямой группировки или сопоставления, отличной от итерации отдельных объектов списка

1 Ответ

3 голосов
/ 31 января 2020

Вы можете использовать Collectors.groupingBy для составления вложенной карты:

children.stream().collect(
    Collectors.groupingBy(
        gc -> gc.getChild().getParent().getFamilyLegacy().getId(),
        Collectors.groupingBy(
            gc -> gc.getChild().getParent().getId(),
            Collectors.groupingBy(
                gc -> gc.getChild().getId()))));

Вы можете видеть, откуда берется лямбда для получения ключей.

Тип будет тогда Map<String, Map<String, Map<String, GrandChild>>>. Заполнение первого ключа должно быть FamilyLegacy, второго - Parent, третьего - Child.

Редактировать:

Начиная с FamilyLegacy вы можете использовать Collectors.toMap, например так :

familyLegacy.getParents().stream().collect(
    Collectors.toMap(
        p -> p.getId(),
        p -> p.getChildList().stream().collect(
            Collectors.toMap(
                c -> c.getId(),
                c -> c.getGrandChildList().stream().collect(
                    Collectors.toMap(
                        gc -> gc.getId(),
                        Function.identity()))))));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...