К сожалению, невозможно разумно улучшить его с помощью потоков, чтобы он мог работать лучше в однопоточном режиме.
Код, который вы указали в своем вопросе, понятен для понимания и достаточно эффективен для небольшой коллекции, как сейчас.
Если вы хотите повысить производительность своего решения, вы можете выполнить итерацию по своей коллекции всего один раз итеративным способом, вычисляя каждый необходимый результат за один прогон:
long amountOfItems = 0;
double priseSum = 0;
double highestWarrantyLimit = Double.MIN_VALUE;
for (Item item : itemList) {
amountOfItems++;
priseSum += item.getPrice();
double investmentValue = getTotalInvestmentValue(item.getInvestmentValue(), item.getInvestmentValuePackaging());
if (highestWarrantyLimit < investmentValue) {
highestWarrantyLimit = investmentValue;
}
}
ItemCalculation itemCalculation = ItemCalculation.builder()
.amountOfItems(amountOfItems)
.averagePrice(priseSum / amountOfItems)
.averageInvestmentValue(investmentValueSum / amountOfItems)
.highestWarrantyLimit(highestWarrantyLimit)
// ...
.build();
Был добавлен API потоков, чтобы обеспечить поддержку библиотек для обработки последовательностей элементов данных, что очень верно для вашего случая. Тем не менее, потоки навязывают общий конвейер для элементов данных, что неверно для вашего случая и делает конвейер похожим на:
itemList.stream()
.collect(toItemCalculation());
Что не очень разумно, если только вы не собираетесь использовать его в многопоточном режиме. В таком случае было бы предпочтительнее решение, использующее пользовательский коллектор, поскольку код скаффолдинга для объединения логики уже встроен.