Cumulative Sum using Java 8 stream APIIs Java “pass-by-reference” or “pass-by-value”?How do I efficiently iterate over each entry in a Java Map?What is the difference between public, protected, package-private and private in Java?How do I read / convert an InputStream into a String in Java?When to use LinkedList over ArrayList in Java?How do I generate random integers within a specific range in Java?How do I convert a String to an int in Java?Creating a memory leak with JavaJava 8 List<V> into Map<K, V>How to Convert a Java 8 Stream to an Array?

Why would five hundred and five be same as one?

Would this string work as string?

What is the tangent at a sharp point on a curve?

How do I tell my boss that I'm quitting in 15 days (a colleague left this week)

Echo with obfuscation

Proving an identity involving cross products and coplanar vectors

Why is the sun approximated as a black body at ~ 5800 K?

How can I, as DM, avoid the Conga Line of Death occurring when implementing some form of flanking rule?

Do people actually use the word "kaputt" in conversation?

Can I run 125khz RF circuit on a breadboard?

When and why was runway 07/25 at Kai Tak removed?

Did I make a mistake by ccing email to boss to others?

Adjusting bounding box of PlotLegends in TimelinePlot

How to Disable and Drop all Temporal Tables from a database

How to test the sharpness of a knife?

PTIJ: does fasting on Ta'anis Esther give us reward as if we celebrated 2 Purims? (similar to Yom Kippur)

Why does the Persian emissary display a string of crowned skulls?

Remove all of the duplicate numbers in an array of numbers

Sigmoid with a slope but no asymptotes?

Magento Commands Not working

What is the meaning of "You've never met a graph you didn't like?"

How do I prevent inappropriate ads from appearing in my game?

If Captain Marvel (MCU) were to have a child with a human male, would the child be human or Kree?

Overlapping circles covering polygon



Cumulative Sum using Java 8 stream API


Is Java “pass-by-reference” or “pass-by-value”?How do I efficiently iterate over each entry in a Java Map?What is the difference between public, protected, package-private and private in Java?How do I read / convert an InputStream into a String in Java?When to use LinkedList over ArrayList in Java?How do I generate random integers within a specific range in Java?How do I convert a String to an int in Java?Creating a memory leak with JavaJava 8 List<V> into Map<K, V>How to Convert a Java 8 Stream to an Array?













6















I have a List of Integer say list1, and I want to get another list list2 which will contain the cumulative sum up until the current index from start. How can I do this using Stream API java 8 ?



List<Integer> list1 = new ArrayList<>();
list1.addAll(Arrays.asList(1, 2, 3, 4));
List<Integer> list2 = new ArrayList<>();
// initialization
list2.add(list1.get(0));
for(int i=1;i<list1.size();i++)
// increment step
list2.add(list2.get(i-1) + list1.get(i));



How can I change above imperative style code into declarative one ?



list2 should be [1, 3, 6, 10]









share|improve this question



















  • 9





    You'll notice from the answers that any solution using streams is going to be inefficient. Streams aren't really intended for this use case. (In general, streams aren't intended to replace all imperative code.)

    – Louis Wasserman
    1 hour ago











  • @LouisWasserman I agree. But in this case I do not care about efficiency (probably should have mentioned it in the question). I wanted to write the same thing with something other than above mentioned imperative style. I could not do it myself, as I was stuck because the solution is kind of mixture of map and reduce operation

    – run_time_error
    1 hour ago















6















I have a List of Integer say list1, and I want to get another list list2 which will contain the cumulative sum up until the current index from start. How can I do this using Stream API java 8 ?



List<Integer> list1 = new ArrayList<>();
list1.addAll(Arrays.asList(1, 2, 3, 4));
List<Integer> list2 = new ArrayList<>();
// initialization
list2.add(list1.get(0));
for(int i=1;i<list1.size();i++)
// increment step
list2.add(list2.get(i-1) + list1.get(i));



How can I change above imperative style code into declarative one ?



list2 should be [1, 3, 6, 10]









share|improve this question



















  • 9





    You'll notice from the answers that any solution using streams is going to be inefficient. Streams aren't really intended for this use case. (In general, streams aren't intended to replace all imperative code.)

    – Louis Wasserman
    1 hour ago











  • @LouisWasserman I agree. But in this case I do not care about efficiency (probably should have mentioned it in the question). I wanted to write the same thing with something other than above mentioned imperative style. I could not do it myself, as I was stuck because the solution is kind of mixture of map and reduce operation

    – run_time_error
    1 hour ago













6












6








6


2






I have a List of Integer say list1, and I want to get another list list2 which will contain the cumulative sum up until the current index from start. How can I do this using Stream API java 8 ?



List<Integer> list1 = new ArrayList<>();
list1.addAll(Arrays.asList(1, 2, 3, 4));
List<Integer> list2 = new ArrayList<>();
// initialization
list2.add(list1.get(0));
for(int i=1;i<list1.size();i++)
// increment step
list2.add(list2.get(i-1) + list1.get(i));



How can I change above imperative style code into declarative one ?



list2 should be [1, 3, 6, 10]









share|improve this question
















I have a List of Integer say list1, and I want to get another list list2 which will contain the cumulative sum up until the current index from start. How can I do this using Stream API java 8 ?



List<Integer> list1 = new ArrayList<>();
list1.addAll(Arrays.asList(1, 2, 3, 4));
List<Integer> list2 = new ArrayList<>();
// initialization
list2.add(list1.get(0));
for(int i=1;i<list1.size();i++)
// increment step
list2.add(list2.get(i-1) + list1.get(i));



How can I change above imperative style code into declarative one ?



list2 should be [1, 3, 6, 10]






java java-8 java-stream






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 hours ago









Stefan Zobel

2,47231931




2,47231931










asked 2 hours ago









run_time_errorrun_time_error

143211




143211







  • 9





    You'll notice from the answers that any solution using streams is going to be inefficient. Streams aren't really intended for this use case. (In general, streams aren't intended to replace all imperative code.)

    – Louis Wasserman
    1 hour ago











  • @LouisWasserman I agree. But in this case I do not care about efficiency (probably should have mentioned it in the question). I wanted to write the same thing with something other than above mentioned imperative style. I could not do it myself, as I was stuck because the solution is kind of mixture of map and reduce operation

    – run_time_error
    1 hour ago












  • 9





    You'll notice from the answers that any solution using streams is going to be inefficient. Streams aren't really intended for this use case. (In general, streams aren't intended to replace all imperative code.)

    – Louis Wasserman
    1 hour ago











  • @LouisWasserman I agree. But in this case I do not care about efficiency (probably should have mentioned it in the question). I wanted to write the same thing with something other than above mentioned imperative style. I could not do it myself, as I was stuck because the solution is kind of mixture of map and reduce operation

    – run_time_error
    1 hour ago







9




9





You'll notice from the answers that any solution using streams is going to be inefficient. Streams aren't really intended for this use case. (In general, streams aren't intended to replace all imperative code.)

– Louis Wasserman
1 hour ago





You'll notice from the answers that any solution using streams is going to be inefficient. Streams aren't really intended for this use case. (In general, streams aren't intended to replace all imperative code.)

– Louis Wasserman
1 hour ago













@LouisWasserman I agree. But in this case I do not care about efficiency (probably should have mentioned it in the question). I wanted to write the same thing with something other than above mentioned imperative style. I could not do it myself, as I was stuck because the solution is kind of mixture of map and reduce operation

– run_time_error
1 hour ago





@LouisWasserman I agree. But in this case I do not care about efficiency (probably should have mentioned it in the question). I wanted to write the same thing with something other than above mentioned imperative style. I could not do it myself, as I was stuck because the solution is kind of mixture of map and reduce operation

– run_time_error
1 hour ago












5 Answers
5






active

oldest

votes


















3














For every index: iterate from zero to that index, get each element, and get the sum

Box the ints to Integers

Collect to a list



IntStream.range(0, list1.size())
.map(i -> IntStream.rangeClosed(0, i).map(list1::get).sum())
.boxed()
.collect(Collectors.toList());


You're adding every number together every time, rather than reusing the previous cumulative result, but streams do not lend themselves to looking at results from previous iterations.



You could write your own collector but at this point, honestly why are you even bothering with streams?



list1.stream()
.collect(
Collector.of(
ArrayList::new,
(a, b) -> a.add(a.isEmpty() ? b : b + a.get(a.size() - 1)),
(a, b) -> throw new UnsupportedOperationException();
)
);





share|improve this answer




















  • 4





    That's O(n^2) !! (as opposed to the O(n) of the OP)

    – DodgyCodeException
    2 hours ago







  • 1





    @DodgyCodeException Yes.

    – Michael
    2 hours ago











  • @Michael thanks for your elaborate response. I have learnt that I can write my own collector. I know this is overkill. But good to know that there are other ways.

    – run_time_error
    1 hour ago


















2














An O(n) solution would be the following, but I don't find it very elegant. I guess it is a matter of taste



AtomicInteger ai = new AtomicInteger();
List<Integer> collect = list1.stream().map(ai::addAndGet)
.collect(Collectors.toList());
System.out.println(collect); // [1, 3, 6, 10]





share|improve this answer


















  • 2





    This solution only works as long as the stream is sequential. Parallelising it would break this completely.

    – Ben R.
    1 hour ago


















2














Streams are not suited for this kind of task, as there is state involved (the cumulative partial sum). Instead, you could use Arrays.parallelPrefix:



Integer[] arr = list1.toArray(Integer[]::new);

Arrays.parallelPrefix(arr, Integer::sum);

List<Integer> list2 = Arrays.asList(arr);


This first copies list1 to an array by using Collection.toArray, which is available since JDK 11. If you are not on Java 11 yet, you could replace the first line with the traditional toArray call:



Integer[] arr = list1.toArray(new Integer[list1.size()]);


This solution doesn't use streams, yet it's declarative, because Arrays.parallelPrefix receives the cumulative operation as an argument (Integer::sum in this case).



Time complexity is O(N), though there might be some not-minor constant costs involved associated with setting up the infrastructure needed for parallel processing. However, according to the docs:




Parallel prefix computation is usually more efficient than sequential loops for large arrays




So it seems it's worth giving this approach a try.






share|improve this answer




















  • 1





    Never heard of parallel prefix. thank you very much for teaching me a new concept. :). I will definitely give a try.

    – run_time_error
    1 hour ago











  • @run_time_error Here's more reading about the subject.

    – Federico Peralta Schaffner
    21 mins ago


















1














You can use sublist to sum up until the current index from start:



List<Integer> list = IntStream.range(0, list1.size())
.mapToObj(i -> list1.subList(0, i + 1).stream().mapToInt(Integer::intValue).sum())
.collect(Collectors.toList());





share|improve this answer




















  • 4





    can also be mapToInt(Integer::intValue)

    – Sharon Ben Asher
    2 hours ago


















0














You can just use Stream.collect() for that:



List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
List<Integer> list2 = list1.stream()
.collect(ArrayList::new, (sums, number) ->
if (sums.isEmpty())
sums.add(number);
else
sums.add(sums.get(sums.size() - 1) + number);

, (sums1, sums2) ->
if (!sums1.isEmpty())
int sum = sums1.get(sums1.size() - 1);
sums2.replaceAll(num -> sum + num);

sums1.addAll(sums2);
);


This solution also works for parallel streams. Use list1.parallelStream() or list1.stream().parallel() instead of list1.stream().



The result in both cases is: [1, 3, 6, 10]






share|improve this answer
























    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55265797%2fcumulative-sum-using-java-8-stream-api%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    5 Answers
    5






    active

    oldest

    votes








    5 Answers
    5






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    3














    For every index: iterate from zero to that index, get each element, and get the sum

    Box the ints to Integers

    Collect to a list



    IntStream.range(0, list1.size())
    .map(i -> IntStream.rangeClosed(0, i).map(list1::get).sum())
    .boxed()
    .collect(Collectors.toList());


    You're adding every number together every time, rather than reusing the previous cumulative result, but streams do not lend themselves to looking at results from previous iterations.



    You could write your own collector but at this point, honestly why are you even bothering with streams?



    list1.stream()
    .collect(
    Collector.of(
    ArrayList::new,
    (a, b) -> a.add(a.isEmpty() ? b : b + a.get(a.size() - 1)),
    (a, b) -> throw new UnsupportedOperationException();
    )
    );





    share|improve this answer




















    • 4





      That's O(n^2) !! (as opposed to the O(n) of the OP)

      – DodgyCodeException
      2 hours ago







    • 1





      @DodgyCodeException Yes.

      – Michael
      2 hours ago











    • @Michael thanks for your elaborate response. I have learnt that I can write my own collector. I know this is overkill. But good to know that there are other ways.

      – run_time_error
      1 hour ago















    3














    For every index: iterate from zero to that index, get each element, and get the sum

    Box the ints to Integers

    Collect to a list



    IntStream.range(0, list1.size())
    .map(i -> IntStream.rangeClosed(0, i).map(list1::get).sum())
    .boxed()
    .collect(Collectors.toList());


    You're adding every number together every time, rather than reusing the previous cumulative result, but streams do not lend themselves to looking at results from previous iterations.



    You could write your own collector but at this point, honestly why are you even bothering with streams?



    list1.stream()
    .collect(
    Collector.of(
    ArrayList::new,
    (a, b) -> a.add(a.isEmpty() ? b : b + a.get(a.size() - 1)),
    (a, b) -> throw new UnsupportedOperationException();
    )
    );





    share|improve this answer




















    • 4





      That's O(n^2) !! (as opposed to the O(n) of the OP)

      – DodgyCodeException
      2 hours ago







    • 1





      @DodgyCodeException Yes.

      – Michael
      2 hours ago











    • @Michael thanks for your elaborate response. I have learnt that I can write my own collector. I know this is overkill. But good to know that there are other ways.

      – run_time_error
      1 hour ago













    3












    3








    3







    For every index: iterate from zero to that index, get each element, and get the sum

    Box the ints to Integers

    Collect to a list



    IntStream.range(0, list1.size())
    .map(i -> IntStream.rangeClosed(0, i).map(list1::get).sum())
    .boxed()
    .collect(Collectors.toList());


    You're adding every number together every time, rather than reusing the previous cumulative result, but streams do not lend themselves to looking at results from previous iterations.



    You could write your own collector but at this point, honestly why are you even bothering with streams?



    list1.stream()
    .collect(
    Collector.of(
    ArrayList::new,
    (a, b) -> a.add(a.isEmpty() ? b : b + a.get(a.size() - 1)),
    (a, b) -> throw new UnsupportedOperationException();
    )
    );





    share|improve this answer















    For every index: iterate from zero to that index, get each element, and get the sum

    Box the ints to Integers

    Collect to a list



    IntStream.range(0, list1.size())
    .map(i -> IntStream.rangeClosed(0, i).map(list1::get).sum())
    .boxed()
    .collect(Collectors.toList());


    You're adding every number together every time, rather than reusing the previous cumulative result, but streams do not lend themselves to looking at results from previous iterations.



    You could write your own collector but at this point, honestly why are you even bothering with streams?



    list1.stream()
    .collect(
    Collector.of(
    ArrayList::new,
    (a, b) -> a.add(a.isEmpty() ? b : b + a.get(a.size() - 1)),
    (a, b) -> throw new UnsupportedOperationException();
    )
    );






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 1 hour ago

























    answered 2 hours ago









    MichaelMichael

    21.1k83572




    21.1k83572







    • 4





      That's O(n^2) !! (as opposed to the O(n) of the OP)

      – DodgyCodeException
      2 hours ago







    • 1





      @DodgyCodeException Yes.

      – Michael
      2 hours ago











    • @Michael thanks for your elaborate response. I have learnt that I can write my own collector. I know this is overkill. But good to know that there are other ways.

      – run_time_error
      1 hour ago












    • 4





      That's O(n^2) !! (as opposed to the O(n) of the OP)

      – DodgyCodeException
      2 hours ago







    • 1





      @DodgyCodeException Yes.

      – Michael
      2 hours ago











    • @Michael thanks for your elaborate response. I have learnt that I can write my own collector. I know this is overkill. But good to know that there are other ways.

      – run_time_error
      1 hour ago







    4




    4





    That's O(n^2) !! (as opposed to the O(n) of the OP)

    – DodgyCodeException
    2 hours ago






    That's O(n^2) !! (as opposed to the O(n) of the OP)

    – DodgyCodeException
    2 hours ago





    1




    1





    @DodgyCodeException Yes.

    – Michael
    2 hours ago





    @DodgyCodeException Yes.

    – Michael
    2 hours ago













    @Michael thanks for your elaborate response. I have learnt that I can write my own collector. I know this is overkill. But good to know that there are other ways.

    – run_time_error
    1 hour ago





    @Michael thanks for your elaborate response. I have learnt that I can write my own collector. I know this is overkill. But good to know that there are other ways.

    – run_time_error
    1 hour ago













    2














    An O(n) solution would be the following, but I don't find it very elegant. I guess it is a matter of taste



    AtomicInteger ai = new AtomicInteger();
    List<Integer> collect = list1.stream().map(ai::addAndGet)
    .collect(Collectors.toList());
    System.out.println(collect); // [1, 3, 6, 10]





    share|improve this answer


















    • 2





      This solution only works as long as the stream is sequential. Parallelising it would break this completely.

      – Ben R.
      1 hour ago















    2














    An O(n) solution would be the following, but I don't find it very elegant. I guess it is a matter of taste



    AtomicInteger ai = new AtomicInteger();
    List<Integer> collect = list1.stream().map(ai::addAndGet)
    .collect(Collectors.toList());
    System.out.println(collect); // [1, 3, 6, 10]





    share|improve this answer


















    • 2





      This solution only works as long as the stream is sequential. Parallelising it would break this completely.

      – Ben R.
      1 hour ago













    2












    2








    2







    An O(n) solution would be the following, but I don't find it very elegant. I guess it is a matter of taste



    AtomicInteger ai = new AtomicInteger();
    List<Integer> collect = list1.stream().map(ai::addAndGet)
    .collect(Collectors.toList());
    System.out.println(collect); // [1, 3, 6, 10]





    share|improve this answer













    An O(n) solution would be the following, but I don't find it very elegant. I guess it is a matter of taste



    AtomicInteger ai = new AtomicInteger();
    List<Integer> collect = list1.stream().map(ai::addAndGet)
    .collect(Collectors.toList());
    System.out.println(collect); // [1, 3, 6, 10]






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered 1 hour ago









    Yassin HajajYassin Hajaj

    14.2k72961




    14.2k72961







    • 2





      This solution only works as long as the stream is sequential. Parallelising it would break this completely.

      – Ben R.
      1 hour ago












    • 2





      This solution only works as long as the stream is sequential. Parallelising it would break this completely.

      – Ben R.
      1 hour ago







    2




    2





    This solution only works as long as the stream is sequential. Parallelising it would break this completely.

    – Ben R.
    1 hour ago





    This solution only works as long as the stream is sequential. Parallelising it would break this completely.

    – Ben R.
    1 hour ago











    2














    Streams are not suited for this kind of task, as there is state involved (the cumulative partial sum). Instead, you could use Arrays.parallelPrefix:



    Integer[] arr = list1.toArray(Integer[]::new);

    Arrays.parallelPrefix(arr, Integer::sum);

    List<Integer> list2 = Arrays.asList(arr);


    This first copies list1 to an array by using Collection.toArray, which is available since JDK 11. If you are not on Java 11 yet, you could replace the first line with the traditional toArray call:



    Integer[] arr = list1.toArray(new Integer[list1.size()]);


    This solution doesn't use streams, yet it's declarative, because Arrays.parallelPrefix receives the cumulative operation as an argument (Integer::sum in this case).



    Time complexity is O(N), though there might be some not-minor constant costs involved associated with setting up the infrastructure needed for parallel processing. However, according to the docs:




    Parallel prefix computation is usually more efficient than sequential loops for large arrays




    So it seems it's worth giving this approach a try.






    share|improve this answer




















    • 1





      Never heard of parallel prefix. thank you very much for teaching me a new concept. :). I will definitely give a try.

      – run_time_error
      1 hour ago











    • @run_time_error Here's more reading about the subject.

      – Federico Peralta Schaffner
      21 mins ago















    2














    Streams are not suited for this kind of task, as there is state involved (the cumulative partial sum). Instead, you could use Arrays.parallelPrefix:



    Integer[] arr = list1.toArray(Integer[]::new);

    Arrays.parallelPrefix(arr, Integer::sum);

    List<Integer> list2 = Arrays.asList(arr);


    This first copies list1 to an array by using Collection.toArray, which is available since JDK 11. If you are not on Java 11 yet, you could replace the first line with the traditional toArray call:



    Integer[] arr = list1.toArray(new Integer[list1.size()]);


    This solution doesn't use streams, yet it's declarative, because Arrays.parallelPrefix receives the cumulative operation as an argument (Integer::sum in this case).



    Time complexity is O(N), though there might be some not-minor constant costs involved associated with setting up the infrastructure needed for parallel processing. However, according to the docs:




    Parallel prefix computation is usually more efficient than sequential loops for large arrays




    So it seems it's worth giving this approach a try.






    share|improve this answer




















    • 1





      Never heard of parallel prefix. thank you very much for teaching me a new concept. :). I will definitely give a try.

      – run_time_error
      1 hour ago











    • @run_time_error Here's more reading about the subject.

      – Federico Peralta Schaffner
      21 mins ago













    2












    2








    2







    Streams are not suited for this kind of task, as there is state involved (the cumulative partial sum). Instead, you could use Arrays.parallelPrefix:



    Integer[] arr = list1.toArray(Integer[]::new);

    Arrays.parallelPrefix(arr, Integer::sum);

    List<Integer> list2 = Arrays.asList(arr);


    This first copies list1 to an array by using Collection.toArray, which is available since JDK 11. If you are not on Java 11 yet, you could replace the first line with the traditional toArray call:



    Integer[] arr = list1.toArray(new Integer[list1.size()]);


    This solution doesn't use streams, yet it's declarative, because Arrays.parallelPrefix receives the cumulative operation as an argument (Integer::sum in this case).



    Time complexity is O(N), though there might be some not-minor constant costs involved associated with setting up the infrastructure needed for parallel processing. However, according to the docs:




    Parallel prefix computation is usually more efficient than sequential loops for large arrays




    So it seems it's worth giving this approach a try.






    share|improve this answer















    Streams are not suited for this kind of task, as there is state involved (the cumulative partial sum). Instead, you could use Arrays.parallelPrefix:



    Integer[] arr = list1.toArray(Integer[]::new);

    Arrays.parallelPrefix(arr, Integer::sum);

    List<Integer> list2 = Arrays.asList(arr);


    This first copies list1 to an array by using Collection.toArray, which is available since JDK 11. If you are not on Java 11 yet, you could replace the first line with the traditional toArray call:



    Integer[] arr = list1.toArray(new Integer[list1.size()]);


    This solution doesn't use streams, yet it's declarative, because Arrays.parallelPrefix receives the cumulative operation as an argument (Integer::sum in this case).



    Time complexity is O(N), though there might be some not-minor constant costs involved associated with setting up the infrastructure needed for parallel processing. However, according to the docs:




    Parallel prefix computation is usually more efficient than sequential loops for large arrays




    So it seems it's worth giving this approach a try.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 1 hour ago

























    answered 1 hour ago









    Federico Peralta SchaffnerFederico Peralta Schaffner

    23.6k43778




    23.6k43778







    • 1





      Never heard of parallel prefix. thank you very much for teaching me a new concept. :). I will definitely give a try.

      – run_time_error
      1 hour ago











    • @run_time_error Here's more reading about the subject.

      – Federico Peralta Schaffner
      21 mins ago












    • 1





      Never heard of parallel prefix. thank you very much for teaching me a new concept. :). I will definitely give a try.

      – run_time_error
      1 hour ago











    • @run_time_error Here's more reading about the subject.

      – Federico Peralta Schaffner
      21 mins ago







    1




    1





    Never heard of parallel prefix. thank you very much for teaching me a new concept. :). I will definitely give a try.

    – run_time_error
    1 hour ago





    Never heard of parallel prefix. thank you very much for teaching me a new concept. :). I will definitely give a try.

    – run_time_error
    1 hour ago













    @run_time_error Here's more reading about the subject.

    – Federico Peralta Schaffner
    21 mins ago





    @run_time_error Here's more reading about the subject.

    – Federico Peralta Schaffner
    21 mins ago











    1














    You can use sublist to sum up until the current index from start:



    List<Integer> list = IntStream.range(0, list1.size())
    .mapToObj(i -> list1.subList(0, i + 1).stream().mapToInt(Integer::intValue).sum())
    .collect(Collectors.toList());





    share|improve this answer




















    • 4





      can also be mapToInt(Integer::intValue)

      – Sharon Ben Asher
      2 hours ago















    1














    You can use sublist to sum up until the current index from start:



    List<Integer> list = IntStream.range(0, list1.size())
    .mapToObj(i -> list1.subList(0, i + 1).stream().mapToInt(Integer::intValue).sum())
    .collect(Collectors.toList());





    share|improve this answer




















    • 4





      can also be mapToInt(Integer::intValue)

      – Sharon Ben Asher
      2 hours ago













    1












    1








    1







    You can use sublist to sum up until the current index from start:



    List<Integer> list = IntStream.range(0, list1.size())
    .mapToObj(i -> list1.subList(0, i + 1).stream().mapToInt(Integer::intValue).sum())
    .collect(Collectors.toList());





    share|improve this answer















    You can use sublist to sum up until the current index from start:



    List<Integer> list = IntStream.range(0, list1.size())
    .mapToObj(i -> list1.subList(0, i + 1).stream().mapToInt(Integer::intValue).sum())
    .collect(Collectors.toList());






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited 2 hours ago

























    answered 2 hours ago









    RuslanRuslan

    3,8461027




    3,8461027







    • 4





      can also be mapToInt(Integer::intValue)

      – Sharon Ben Asher
      2 hours ago












    • 4





      can also be mapToInt(Integer::intValue)

      – Sharon Ben Asher
      2 hours ago







    4




    4





    can also be mapToInt(Integer::intValue)

    – Sharon Ben Asher
    2 hours ago





    can also be mapToInt(Integer::intValue)

    – Sharon Ben Asher
    2 hours ago











    0














    You can just use Stream.collect() for that:



    List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
    List<Integer> list2 = list1.stream()
    .collect(ArrayList::new, (sums, number) ->
    if (sums.isEmpty())
    sums.add(number);
    else
    sums.add(sums.get(sums.size() - 1) + number);

    , (sums1, sums2) ->
    if (!sums1.isEmpty())
    int sum = sums1.get(sums1.size() - 1);
    sums2.replaceAll(num -> sum + num);

    sums1.addAll(sums2);
    );


    This solution also works for parallel streams. Use list1.parallelStream() or list1.stream().parallel() instead of list1.stream().



    The result in both cases is: [1, 3, 6, 10]






    share|improve this answer





























      0














      You can just use Stream.collect() for that:



      List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
      List<Integer> list2 = list1.stream()
      .collect(ArrayList::new, (sums, number) ->
      if (sums.isEmpty())
      sums.add(number);
      else
      sums.add(sums.get(sums.size() - 1) + number);

      , (sums1, sums2) ->
      if (!sums1.isEmpty())
      int sum = sums1.get(sums1.size() - 1);
      sums2.replaceAll(num -> sum + num);

      sums1.addAll(sums2);
      );


      This solution also works for parallel streams. Use list1.parallelStream() or list1.stream().parallel() instead of list1.stream().



      The result in both cases is: [1, 3, 6, 10]






      share|improve this answer



























        0












        0








        0







        You can just use Stream.collect() for that:



        List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
        List<Integer> list2 = list1.stream()
        .collect(ArrayList::new, (sums, number) ->
        if (sums.isEmpty())
        sums.add(number);
        else
        sums.add(sums.get(sums.size() - 1) + number);

        , (sums1, sums2) ->
        if (!sums1.isEmpty())
        int sum = sums1.get(sums1.size() - 1);
        sums2.replaceAll(num -> sum + num);

        sums1.addAll(sums2);
        );


        This solution also works for parallel streams. Use list1.parallelStream() or list1.stream().parallel() instead of list1.stream().



        The result in both cases is: [1, 3, 6, 10]






        share|improve this answer















        You can just use Stream.collect() for that:



        List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
        List<Integer> list2 = list1.stream()
        .collect(ArrayList::new, (sums, number) ->
        if (sums.isEmpty())
        sums.add(number);
        else
        sums.add(sums.get(sums.size() - 1) + number);

        , (sums1, sums2) ->
        if (!sums1.isEmpty())
        int sum = sums1.get(sums1.size() - 1);
        sums2.replaceAll(num -> sum + num);

        sums1.addAll(sums2);
        );


        This solution also works for parallel streams. Use list1.parallelStream() or list1.stream().parallel() instead of list1.stream().



        The result in both cases is: [1, 3, 6, 10]







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 34 mins ago

























        answered 52 mins ago









        Samuel PhilippSamuel Philipp

        2,482624




        2,482624



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55265797%2fcumulative-sum-using-java-8-stream-api%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Era Viking Índice Início da Era Viquingue | Cotidiano | Sociedade | Língua | Religião | A arte | As primeiras cidades | As viagens dos viquingues | Viquingues do Oeste e Leste | Fim da Era Viquingue | Fontes históricas | Referências Bibliografia | Ligações externas | Menu de navegação«Sverige då!»«Handel I vikingetid»«O que é Nórdico Antigo»Mito, magia e religião na volsunga saga Um olhar sobre a trajetória mítica do herói sigurd«Bonden var den verklige vikingen»«Vikingatiden»«Vikingatiden»«Vinland»«Guerreiras de Óðinn: As Valkyrjor na Mitologia Viking»1519-9053«Esculpindo símbolos e seres: A arte viking em pedras rúnicas»1679-9313Historia - Tema: VikingarnaAventura e Magia no Mundo das Sagas IslandesasEra Vikinge

            What's the metal clinking sound at the end of credits in Avengers: Endgame?What makes Thanos so strong in Avengers: Endgame?Who is the character that appears at the end of Endgame?What happens to Mjolnir (Thor's hammer) at the end of Endgame?The People's Ages in Avengers: EndgameWhat did Nebula do in Avengers: Endgame?Messing with time in the Avengers: Endgame climaxAvengers: Endgame timelineWhat are the time-travel rules in Avengers Endgame?Why use this song in Avengers: Endgame Opening Logo Sequence?Peggy's age in Avengers Endgame

            Are there legal definitions of ethnicities/races? The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern)Legal definitions in the United StatesAre there truly legal limits on US interest rates?Are gender identity and sexual orientation federally protected?Why is there an apparent legal bias against digital services?What limits are there to the powers of individual judges in the United States legal system?Are women only scholarships legal under Irish / EU law?Is the term “race” defined by Public Law enacted by Congress of the United StatesIs there a legal definition of race in the US?Neighbors are spying for landlord on Renters is it legal?Are Protected Classes Bi-directional?