Пропустить ту же комбинацию в Stream API - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть список FilterList, в котором я транслирую по каждому элементу и использую для каждого из них установку некоторых элементов

filteredList.parallelStream().forEach(s->{

            ARChaic option=new ARChaic();
            option.setCpu(s.getNoOfCPU());
            option.setMem(s.getMemory());
            option.setStorage(s.getStorage());
            option.setOperatingSystem(s.getOperationSystem());


           ARChaic newOption= providerDes.getLatest(option); //this is a external service
        s.setCloudMemory(newOption.getMem());
        s.setCloudCPU(newOption.getCpu());
        s.setCloudStorage(newOption.getStorage());
        s.setCloudOS(newOption.getOperatingSystem());

});

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

Например, если два сервера имеют одинаковую память, процессор, ОС и хранилище, то он вызовет getLatest только один раз.

Предположим, что в позициях 1 и 7 в FilterList у меня та же конфигурация, что я не должен снова вызывать getLatest в 7, поскольку у меня уже есть предыдущее значение параметра, которое я установлю 7 (Работа выполнена после вызова службы)

1 Ответ

0 голосов
/ 21 сентября 2018

Вы можете добавить equals и hashcode к вашему классу Server, чтобы обозначить, когда два экземпляра Сервера равны.Из вашего описания вы должны будете принять во внимание и сравнить память, процессор, ОС и хранилище.

После этого вы можете сопоставить filteredList как Map<Server, List<Server>>, чтобы получить уникальные серверы в качествеключ и значение будут иметь все повторяющиеся экземпляры сервера.Вы будете вызывать службу один раз для каждого ключа на карте, но после получения результата вы можете обновить все экземпляры сервера, являющиеся значением карты, с результатом.

Map<Server, List<Server>> uniqueServers = filteredList.stream()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.mapping(Function.identity(),
                    Collectors.toList())));

uniqueServers.entrySet().parallelStream().forEach(entry -> {
        Server currentServer = entry.getKey(); //Current server
        ARChaic option=new ARChaic();
        option.setCpu(currentServer.getNoOfCPU());
        option.setMem(currentServer.getMemory());
        option.setStorage(currentServer.getStorage());
        option.setOperatingSystem(currentServer.getOperationSystem());

        ARChaic newOption= providerDes.getLatest(option); //this is a external service
        //update all servers with the result.
        entry.getValue().forEach(server -> {
            server.setCloudMemory(newOption.getMem());
            server.setCloudCPU(newOption.getCpu());
            server.setCloudStorage(newOption.getStorage());
            server.setCloudOS(newOption.getOperatingSystem());
        });
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...