Как преобразовать плоский объект в намеренный объект, используя потоки Java - PullRequest
0 голосов
/ 03 января 2019

у меня плоский объект POJO:

class FamilyInformation {
  String house;
  String familyMember;
}

с такими данными:

[{
 house: "houseName1",
familyMember: "Son"
},
{
 house: "houseName1",
familyMember: "Mom"
},
{
 house: "houseName1",
familyMember: "Dad"
}]

И я хочу преобразовать его в иерархический объект POJO:

class House {
  String houseName;
  List<FamilyMember> familyMembers;
}
class FamilyMember {
  String familyMember;
}

Каждая информация, которую я нашел, - это преобразовать ее в карту. Но я хочу иметь List<House>, который содержит List<FamilyMember> любые идеи, что мне делать?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Вот не потоковая версия:

сначала, сгруппируйте по house и сопоставьте с FamilyMember через forEach + computeIfAbsent:

Map<String, List<FamilyMember>> accumulator = new HashMap<>();
source.forEach(f -> accumulator.computeIfAbsent(f.getHouse(),
                  k -> new ArrayList<>()).add(new FamilyMember(f.getFamilyMember())));

Затемвзять каждую запись из accumulator и сопоставить ее с House объектом:

List<House> result = new ArrayList<>();
accumulator.forEach((house, familyMembers) -> result.add(new House(house, familyMembers)));
0 голосов
/ 03 января 2019

Попробуйте это

Map<String,List<FamilyMember>> map = list
              .stream()
              .collect(
                  Collectors.groupingBy(
                      FamilyInformation::getHouseName, 
                      Collectors.mapping(
                          family -> new FamilyMember(family.getFamilyMember()),
                          Collectors.toList()
                      )
                   )
               );

, а затем

 List<House> result = map.entrySet()
        .stream()
        .map(e -> new House(e.getKey(), e.getValue()))
        .collect(Collectors.toList());
...