Параллельные вычисления на наборе данных в 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 при использовании параллельных потоков и измеряйте его.