Я хочу использовать потоковый API Java для выполнения некоторых вычислений в списке объектов:
List<Item>.stream()...
Класс Item
содержит множество атрибутов. Для некоторых из них мне нужно взять среднее значение по всем элементам в коллекции, для других атрибутов мне нужно выполнить другие формы вычислений. Для этого я выполнял отдельные вызовы потока/коллектора, и хотя я не сталкиваюсь с какими-либо проблемами с производительностью (поскольку размер списка обычно составляет около 100), я хочу научиться быть более кратким, например, цикл один раз.
ItemCalculation itemCalculation = ItemCalculation.builder()
.amountOfItems(itemList.size())
.averagePrice(itemList.stream()
.mapToDouble(item -> item.getPrice())
.average()
.getAsDouble())
.averageInvestmentValue(itemList.stream()
.mapToDouble(item -> getTotalInvestmentValue(item.getInvestmentValue(), item.getInvestmentValuePackaging()))
.average()
.getAsDouble())
.highestWarrantyLimit(itemList.stream()... etc.
Я читал о создании собственного коллектора, но мне кажется немного странным, что мой класс «вычисления» состоит всего из одной строки (stream->customCollector), а затем имеет очень раздутый класс коллектора, который выполняет реальную логику. Тем более, что разные атрибуты собираются по-разному, мне понадобится много разных промежуточных счетчиков и других переменных. Какие-нибудь мысли?
itemList
у вас могут возникнуть проблемы с производительностью при работе с потоками, если размер меньше нескольких сотен. Это будет зависеть от операции и, возможно, от самого объекта, поэтому лучше, если вы сможете запустить тест производительности. Помимо производительности, приведенный выше код может быть трудно поддерживать из-за удобочитаемости. - person alltej   schedule 07.05.2018reduce
или в)Collectors.teeing
. - person sfiss   schedule 10.07.2019