I am trying to get into Java 8 and get my head around streams and lambdas to solve various problems and got stuck on this specific one which I normally use a forEach and store the values in a Map to solve.
How would you write the code to get the expected list using the new features in Java 8 ?
List<Integer> voterA = Arrays.asList(1,2,3,4,5);
List<Integer> voterB = Arrays.asList(1,2,3,4,5);
List<List<Integer>> votes = Arrays.asList(voterA, voterB);
// expected list = (2,4,6,8,10)
List<Integer> sumVotes = ...
That one isn't really doable the way you're hoping. The closest you could get would probably be
IntStream.range(0, voterA.size())
.mapToObj(i -> voterA.get(i) + voterB.get(i))
.collect(toList());
...but there's no "zip" operation on streams, largely because two different streams can have backing spliterators that split at different points, so you can't line them up properly.
JDK doesn't provide the 'zip' API. But it can be done with third library AbacusUtil:
List<Integer> voterA = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> voterB = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> sumVotes = Stream.zip(voterA, voterB, (a, b) -> a + b).toList();
Disclosure: I'm the developer of AbacusUtil.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With