Проблема с вашим решением состоит в том, что вы собираете все данные в список, просто для дальнейшего сокращения.Таким образом, он будет накапливать все данные в памяти.Вы можете объединить оба сокращения в одно, используя toMap следующим образом:
myqueries
.parallelstream()
.flatMap( m-> {
//queryresult is a stream which return database rows
return queryresult;
})
.collect(Collectors.toMap(
g-> Arrays.<Object>asList(g.getCountry(), g.getCity()),
v -> {
MyResultClass item = new MyResultClass();
item.setCountry(v.getCountry());
item.setCity(v.getCity());
return item;
},
(t, u) -> {
t.setSumField1(t.getSumField1() + u.getSumField1());
t.setSumField2(t.getSumField2() + u.getSumField3());
t.setSumField3(t.getSumField3() + u.getSumField3());
return t;
}
)
.values().forEach(f-> {
//print the MyResultClass fields
});
Также обратите внимание, что, когда вы используете здесь ParallelsStream, это не означает, что все запросы будут выполняться параллельно,Параллельность будет зависеть от количества запросов, количества ядер в вашей машине и среды выполнения.Если вы хотите контролировать поведение одновременного запроса, лучше использовать ExecutorService .
Еще один момент, на который следует обратить внимание: выполнение также будет зависеть от того, как вы создаете поток из результата запроса.,Если вы подождете, пока не получите весь результат, а затем создадите Stream, тогда вы победите цель самого вопроса.