I have a class, MyClass
, like this:
JavaScript
x
public class MyClass() {
String name;
Long amount;
public MyClass() {
// No arguments constructor
}
public Long getAmount() {
return this.amount;
}
}
If I want to get the sum of amount
in an ArrayList of MyClass items, usually I would do this:
JavaScript
// assuming ArrayList<MyClass> myClassList
Long amount = 0L;
for (MyClass x : myClassList) {
amount += x.getAmount();
}
But now to improve performance, I am trying to use Stream.reduce()
. My approach:
JavaScript
// assuming ArrayList<MyClass> myClassList
// reduce all MyClass items to a single MyClass item that holds the total amount
Long amount = myClassList.stream().reduce(new MyClass(),
(curr, next) -> {
Long currAmount = curr.getAmount() != null ? curr.getAmount() : 0L; // subtotal
Long nextAmount = next.getAmount() != null ? next.getAmount() : 0L; // next value to add
curr.setAmount(currAmount + nextAmount); // next subtotal
return curr;
}).getAmount();
Is there a better way to do so? And how would the reduction be affected if currAmount
or nextAmount
is null?
Advertisement
Answer
But now to improve performance, I am trying to use Stream.reduce()
Stream does not improve performance, the main idea using stream is benefit from functional programming. If you want to improve performance, please do proper benchmarking. Anyway, you can simplify the stream as below.
JavaScript
Long amount = myClassList.stream()
.mapToLong(m -> m.getAmount() == null ? 0L : m.getAmount()).sum();