2017-01-06 2 views
0

У меня есть следующие строки кода java, мне интересно, можно ли полностью преобразовать его в Java 8 Stream?Java Stream Обновление текущей работы

long totalSum = list.parallelStream().mapToLong(ExpenseInfo::getCurrCount).sum(); 

// LOOP ALL COLLECTION 
for (ExpenseInfo info : list) { 
    totalSum -= info.getCurrCount(); 
    info.setBurnCount(totalSum); 
} 

ответ

2

Дело в том, что ваша задача по умолчанию последовательна. Например, первый элемент будет иметь счетчик ожога, установленный на общую сумму минус собственный счет, в то время как второй элемент будет иметь счетчик ожога, установленный на общую сумму минус собственный счет, и счетчик предыдущих элементов и так далее.

То есть, если вам нужно будет повернуть эту последовательность инструкций с использованием потока и что поток будет параллельным (с использованием .stream() или .parallelStream() не должно иметь никакого значения для результата, который вы вычисляете), переменная totalSum будет разделяться и каждый элемент упорядоченного потока должен будет ждать обновленного значения общей суммы, вычисленной каждым предыдущим элементом, что полностью победит цель использования параллелизма.

Таким образом, вы можете использовать другой подход, который сначала сопоставлял бы каждый экземпляр с собственным счетом, а затем использовал Arrays.parallelPrefix для вычисления суммированной суммы в массив.

Наконец, вы можете использовать IntStream, чтобы установить количество заусенцев каждого элемента, вычитая общую сумму и суммированную сумму для этого элемента.

long[] sums = list.stream().mapToLong(ExpenseInfo::getCurrCount).toArray(); 
Arrays.parallelPrefix(sums, Long::sum); 
IntStream.range(0, sums.length).forEach(i -> list.get(i).setBurnCount(sums[sums.length - 1] - sums[i])); 

Конечно, это предполагает, что список является произвольным доступом, так что get(int i) не является дорогостоящей операцией, но все может быть распараллеливание без проблем (на самом деле parallelPrefix уже распараллеливание, как предполагает его название).

Я бы по-прежнему придерживался вашего подхода на первом месте, мне кажется яснее.