0

I have the following json data

[
  {
    "type": "A",
    "name": "SSS",
    "label": "SSS"
  },
  {
    "type": "A",
    "name": "FFF",
    "label": "FFF"
  },
  {
    "type": "B",
    "name": "GGG",
    "label": "GGG"
  },
  {
    "type": "A",
    "name": "HHH",
    "label": "HHH"
  },
  {
    "type": "B",
    "name": "JJJ",
    "label": "JJJ"
  },
  {
    "type": "B",
    "name": "BBB",
    "label": "BBB"
  },
  {
    "type": "A",
    "name": "AAA",
    "label": "AAA"
  },
  {
    "type": "B",
    "name": "WWW",
    "label": "WWW"
  }
]

I want to format the above json data as shown below

[
  {
    "label": "A",
    "options": [
      {
        "value": "SSS",
        "label": "SSS"
      },
      {
        "value": "FFF",
        "label": "FFF"
      },
      {
        "value": "HHH",
        "label": "HHH"
      },
      {
        "value": "AAA",
        "label": "AAA"
      }
    ]
  },
  {
    "label": "B",
    "options": [
      {
        "value": "GGG",
        "label": "GGG"
      },
      {
        "value": "JJJ",
        "label": "JJJ"
      },
      {
        "value": "BBB",
        "label": "BBB"
      },
      {
        "value": "WWW",
        "label": "WWW"
      }
    ]
  }
]

I tried to group by using streams like as shown below

List<TypeData> datas = new ArrayList<>();
datas.add(new TypeData("A","SSS","SSS"));
datas.add(new TypeData("A","FFF","FFF"));
datas.add(new TypeData("B","GGG","GGG"));
datas.add(new TypeData("A","HHH","HHH"));
datas.add(new TypeData("B","JJJ","JJJ"));
datas.add(new TypeData("B","BBB","BBB"));
datas.add(new TypeData("A","AAA","AAA"));
datas.add(new TypeData("B","WWW","WWW"));

My code is as give below and the below java code gives me the actual json structure

List<OptionGroup> optionGroups = new ArrayList<>();
for (TypeData typedata : datas) {
    boolean labelFound = false;
    for(OptionGroup optionGroupDetail : optionGroups) {
       if(optionGroupDetail.getLabel().equals(typedata.getType()))  {
           labelFound = true;
           optionGroupDetail.getOptions().add(new Options(typedata.getLabel(), typedata.getName()));
       }
    }
    if(!labelFound) {
        OptionGroup newOptionGroup = new OptionGroup(typedata.getType(), Lists.newArrayList(new Options(typedata.getLabel(), typedata.getName())));
        optionGroups.add(newOptionGroup);
    }
}

How can I make the above java logic into Streams.

My class definition is as shown below

TypeData.java

class TypeData {
    String type;
    String name;
    String label;
   // getter and setter
}

Options.java

class Options {
    String label;
    String value;
    // getter and setter
}

OptionGroup.java

class OptionGroup {
    String label;
    List <Options> options;
    // getter and setter
}

can someone please help me on this

Alex Man
  • 4,508
  • 16
  • 78
  • 160

0 Answers0