2016-07-29 2 views
2

У меня есть набор данных, как это:Параллельное вычисление по набору данных в 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"; 
    } 
} 

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

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

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

+1

Как вы используете группировку по методу, вероятно, не работает из-за параметра id –

+0

Да @Bolzano, я не могу использовать это здесь, я пытался найти способ группировать объекты на основе метода и применять метод суммирования на групп. 'Карта = sumByType \t \t \t \t \t testSet \t \t \t \t .stream() \t \t \t \t .collect ( \t \t \t \t Collectors.groupingBy ( \t \t \t \t \t CustomObject :: getGroup, \t \t \t \t Collectors.reducing ( \t \t \t \t \t \t 0, \t \t \t \t \t CustomObject :: getQty, \t \t \t \t \t Integer :: сумма))); ' – Harish

+1

нормально первый каждый getGroup не должен Я создаю экземпляр hazelCast, я предлагаю вам любую другую практику для этого, но я хочу знать, где вы планируете аргумент pass id в методе getGroup? –

ответ

3

Вот код, включающий в себя включительно и эксклюзивную сумму.

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

+0

Большое спасибо. Я это попробую. – Harish

+1

как все прошло? –

+0

Работа над ним. Дайте вам знать результат в какой-то момент. – Harish