Cumulative Sum using Java 8 stream API












7















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
    2 hours 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
















7















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
    2 hours 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














7












7








7


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

148211




148211








  • 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
    2 hours 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
    2 hours 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
2 hours 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
2 hours 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



















3














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
    29 mins 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



















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 2 hours 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













    3














    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
      29 mins ago
















    3














    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
      29 mins ago














    3












    3








    3







    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 2 hours 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
      29 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
      29 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
    29 mins ago





    @run_time_error Here's more reading about the subject.

    – Federico Peralta Schaffner
    29 mins 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 2 hours 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











    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 43 mins ago

























        answered 1 hour 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

            90s novel: wood nymph (similar to an otik) who becomes a scientist

            Scriptures other than the Hata Yoga Pradipika containing asanas

            De Pijp