Параллельные вычисления на наборе данных в Java 8?

У меня есть набор данных, как это:

Set<CustomObject> testSet = [{id: a1, qty: 3}, 
                             {id: a2, qty: 9},
                             {id: a3, qty: 5},
                             {id: a4, qty: 8},
                             {id: a5, qty: 12},
                             ...
                             {id: a200, qty: 7}];

Идентификаторы сгруппированы в 3 группы, которые можно найти с помощью метода:

//The getGroup method is implemented in the class CustomObject.
//I am using hazelcast map to store few id's that are inclusive, and
//one of the id that is in the request of the api is the current id.
public String getGroup(String id){
     HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();
     if(id.equals(this.id)){
       return "currentId";
     }else if(id.equals(hazelcastInstance.getMap("idMap").get(id))){
       return "inclusive";
     } else {
       return "exclusive";
     }
}

Приведенный выше набор testS содержит огромные данные, и я хочу выполнить сумму количеств каждого объекта в наборе на основе метода группировки, описанного выше, с использованием Java.

Я пытался использовать потоки, но это не позволяет мне использовать метод getGroup в методе groupingBy Java 8 Streams.

Пожалуйста, объясните мне, как эффективно суммировать значения кол-во на основе групп с параллельной обработкой.

1 ответ

Решение

Вот код, который даст сгруппированную сумму включительно и эксклюзивно.

Map<Object, Integer> resultMap =
                 testSet.stream().parallel()
                 .collect(Collectors.groupingBy(item -> {
                                     if(item.getId().equals(hazelcastInstance.getMap("idMap").get(id))
                                        return "inclusive";
                                     else
                                        return "exclusive";
                                    },
                                    Collectors.summingInt(CustomObject::getQty)));

Кроме того, для повышения производительности используйте ArrayList вместо HashSet при использовании параллельных потоков и измеряйте его.

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