Как я могу оптимизировать циклы? - PullRequest
0 голосов
/ 05 апреля 2020

Существует метод, который принимает два параметра типа String [] в качестве входных данных и выполняет фильтрацию в зависимости от того, что он получил.

Метод

 @Override
    public List<Product> filter(String[] brands, String[] cpus) {
        List<Product> products;
        List<Product> toReturn = new ArrayList<>();
        int i = 0;
        if(brands != null && cpus != null){
            for(String brand: brands){
                for(String cpu: cpus){
                    products = productRepo.findAllByBrandAndCpu(brand, cpu);
                    toReturn.addAll(products);
                    System.out.println(i++);
                }
            }
        }else{
            if (brands != null){
                for (String brand: brands) {
                    products = productRepo.findAllByBrand(brand);
                    toReturn.addAll(products);
                }
            }else if(cpus != null){
                for (String cpu: cpus) {
                    products = productRepo.findAllByCpu(cpu);
                    toReturn.addAll(products);
                }
            }else{
                return productRepo.findAll();
            }
        }
        return toReturn;
    }

Как могу ли я изменить этот код так, чтобы здесь было не так много итераций:

Здесь

if(brands != null && cpus != null){
            for(String brand: brands){
                for(String cpu: cpus){
                    products = productRepo.findAllByBrandAndCpu(brand, cpu);
                    toReturn.addAll(products);
                    System.out.println(i++);
                }
            }
        } 

Метод findAllByBrandAndCpu

@Query(value = "SELECT p FROM Product p where p.brand.name = ?1 and p.cpu.name = ?2")
List<Product> findAllByBrandAndCpu(String brandName, String cpuName);

1 Ответ

0 голосов
/ 05 апреля 2020

Здравствуйте, @Kzz. Вы можете удалить оба вложенных l oop, обновив запрос к репозиторию, используя оператор IN SQL, например:

@Query(value = "SELECT p FROM Product p where p.brand.name IN ?1 and p.cpu.name IN ?2")
List<Product> findAllByBrandAndCpu(List<String> brands, List<String> cpus);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...