Как я могу выполнить фильтр во вложенном списке в другом списке java

Отказ от ответственности: я действительно новичок в Java, и я пытаюсь преобразовать этот json в springboot, используя потоки, чтобы получить вывод, как указано ниже. Но все мои испытания терпят неудачу, что я делаю не так с этим.

[
    {
        "id": 1,
        "year": 2020,
        "description": "Two thousand twenty",
        "brands": [
            {
                "id": 1,
                "name": "Tesla",
                "description": "This is a car provider from USA",
                "countryId": 16,
                "brandNo": "TE001",
                "categoryId": 23
            },
            {
                "id": 2,
                "name": "Toyota",
                "description": "This is a car provider from Japan",
                "countryId": 16,
                "brandNo": "TE003",
                "categoryId": 23
            }
        ]
    },
    {
        "id": 1,
        "year": 2022,
        "description": "Two thousand twenty",
        "brands": [
            {
                "id": 1,
                "name": "Tesla",
                "description": "This is a car provider from USA",
                "countryId": 16,
                "brandNo": "TE001",
                "categoryId": 23
            },
            {
                "id": 2,
                "name": "Toyota",
                "description": "This is a car provider from Japan",
                "countryId": 16,
                "brandNo": "TE003",
                "categoryId": 23
            }
        ]
    }
]

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

[
    {
        "id": 1,
        "year": 2020,
        "description": "Two thousand twenty",
        "brands": [
            {
                "id": 2,
                "name": "Toyota",
                "description": "This is a car provider from Japan",
                "countryId": 16,
                "brandNo": "TE003",
                "categoryId": 23
            }
        ]
    },
    {
        "id": 1,
        "year": 2022,
        "description": "Two thousand twenty",
        "brands": [
            {
                "id": 2,
                "name": "Toyota",
                "description": "This is a car provider from Japan",
                "countryId": 16,
                "brandNo": "TE003",
                "categoryId": 23
            }
        ]
    }
]

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

  List<YearBrandDTO> years = yearRepository.findAll().stream()
                    .map(year -> year.getBrands().stream()
                            .filter(brand -> brand.getName().equals("Toyota")))
                    .map(year -> modelMapper.map(year, YearBrandDTO.class))
                    .collect(Collectors.toList());

И мой DTO выглядит так

@Data
public class YearBrandDTO {
        private Long id;
        private Integer year;
        private String description;
        private Object brands;
}

Но на выходе я получаю нулевые значения

   [
        {
            "id": null,
            "year": null,
            "description": null,
            "brands": null
        }
    ]
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пытаетесь сопоставить результат фильтрации брендов непосредственно с YearBrandDTO. Но вы должны сначала отфильтровать бренды, а затем создать новый объект YearBrandDTO.

Так:

List<YearBrandDTO> years = yearRepository.findAll().stream()
    .map(year -> {
        List<Brand> filteredBrands = year.getBrands().stream()
            .filter(brand -> brand.getName().equals("Toyota"))
            .collect(Collectors.toList());

        YearBrandDTO yearBrandDTO = modelMapper.map(year, YearBrandDTO.class);
        yearBrandDTO.setBrands(filteredBrands);
        return yearBrandDTO;
    })
    .collect(Collectors.toList());

Таким образом, вы сможете получить желаемый результат. Просто обновите свой класс YearBrandDTO, чтобы он имел List<BrandDTO> вместо объекта для поля бренда.

@Data
public class YearBrandDTO {
    private Long id;
    private Integer year;
    private String description;
    private List<BrandDTO> brands;
}

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

Спасибо, @devblack.exe, я реализовал то, чем вы поделились, хотя столкнулся с другой проблемой. В этой строке он жаловался yearBrandDTO.setBrands(finalBrands);, что ожидал данные типа List<BrandDTO>, но предоставил List<BrandEntity>, затем я сделал еще один поток List<BrandDTO> finalBrands = filteredBrands.stream().map(brand -> modelMapper.map(brand, BrandDTO.class)).collect(Collectors.toList());, чтобы получить List<BrandDTO>`, но теперь мой ответ возвращает [{"id": 1, "year": 2020, "description": "Two thousand twenty", "brands": []}], я не знаю, что я делаю неправильно .

isaac ssemugenyi 31.03.2023 13:07

Спасибо @devblack.exe, мне удалось решить проблему, поскольку предыдущий комментарий о преобразовании BrandEntity в BrandDTO работал хорошо, теперь проблема заключалась в том, как я отправлял свой RequestParam, он был заключен в кавычки, которые Java рассматривал совершенно другую строку. После удаления кавычек мне удалось получить нужные данные.

isaac ssemugenyi 31.03.2023 14:48

Другие вопросы по теме