Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java 8 streams adding values from two or more lists

Tags:

java

java-8

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 = ...
like image 565
Steve Carrigan Avatar asked Feb 18 '15 19:02

Steve Carrigan


2 Answers

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.

like image 88
Louis Wasserman Avatar answered Oct 08 '22 14:10

Louis Wasserman


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.

like image 32
user_3380739 Avatar answered Oct 08 '22 16:10

user_3380739