java поток Как объединить то же значение в список - PullRequest
2 голосов
/ 29 апреля 2020

Моя сущность

private String subject;
private String unit1;  
private String unit2;  
private String unit3;  

List<entity> getList = repo.findAll();

"getList" показать этот список мой контроллер возвращает это значение

 [
        {
          "unit1": "wert",
          "unit2": "2",
          "unit3": "6",
          "subject": "grdg"
        },
        {
          "unit1": "sdfg",
          "unit2": "2",
          "unit3": "e",
          "subject": "gdsg4"
        },
        {
          "unit1": "sdfg",
          "unit2": "3",
          "unit3": "hrh",
          "subject": "g4ds"
        },
        {
          "unit1": "qwer",
          "unit2": "4",
          "unit3": "rh5",
          "subject": "g4e"
        },
        {
          "unit1": "asdf",
          "unit2": "5",
          "unit3": "erty",
          "subject": "asdf"
        },
    {
      "unit1": "zxcv",
      "unit2": "2",
      "unit3": "3",
      "subject": "asdf"
    }
  ]

и я хочу объединить ту же тему

{asdf:[{"unit1": "wert",
      "unit2": "2",
      "unit3": "6"},{ "unit1": "zxcv",
      "unit2": "2",
      "unit3": "3"}],
g4e:[{
          "unit1": "qwer",
          "unit2": "4",
          "unit3": "rh5"}]
        }
}

Я имею в виду, я хочу слить вот так

{ subject_name:[other_data]}

getList.stream.collect(Collectors.groupingBy(Subject::getSubject)).values().stream().collect(Collectors.toList());

что слияние кода правильно?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2020

Достаточно кода для groupBy, чтобы не извлекать значения из сгруппированного Map, так как у вас остается отображение каждого субъекта на соответствующие List сущности.

Map<String, List<Subject>> subjectMap = getList.stream()
        .collect(Collectors.groupingBy(Subject::getSubject));

Кроме того, если вы хотите отобразить элементы List<Subject> на другой тип представления, вы можете выполнить операцию отображения следующим образом:

Map<String, List<Wrapper>> subjectMap = getList.stream()
        .collect(Collectors.groupingBy(Subject::getSubject,
                Collectors.mapping(Wrapper::extractAttributes,
                        Collectors.toList())));

с дополнительным классом, определенным как (или вы могли бы также решили изменить существующий класс Subject):

@Builder
static class Wrapper {
    private String unit1;
    private String unit2;
    private String unit3;

    public static Wrapper extractAttributes(Subject subject) {
        return Wrapper.builder().unit1(subject.getUnit1())
                .unit2(subject.getUnit2())
                .unit3(subject.getUnit3()).build();
    }
}
0 голосов
/ 29 апреля 2020

как насчет этого?

 asdf: [
                {
                    "unit1":
                        [{
                            "getdata": [{
                                "unit2": "asdff",
                                "unit3": "aaa"
                            }, {
                                "unit2": "3sfa",
                                "unit3": "ff"
                            }, {
                                "unit2":
                                    [{
                                        "unit2_va": [
                                            {"unit3": "aaa"},
                                            {"unit3": "ccc"}
                                        ]

                                    }]
                            }]
                        }
                        ]
                }]

это то же самое?

...