Java 8流从两个或多个列表中添加值

Ste*_*gan 5 java java-8

我正在尝试进入Java 8并绕过流和lambdas来解决各种问题并且陷入这个特定的问题,我通常使用forEach并将值存储在Map中来解决.

您将如何编写代码以使用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 = ...
Run Code Online (Sandbox Code Playgroud)

Lou*_*man 7

那个人并不像你希望的那样可行.你可能得到的最接近的可能是

IntStream.range(0, voterA.size())
    .mapToObj(i -> voterA.get(i) + voterB.get(i))
    .collect(toList());
Run Code Online (Sandbox Code Playgroud)

...但是在流上没有"zip"操作,很大程度上是因为两个不同的流可以在不同的点上分割背板分裂器,所以你不能正确排列它们.

  • 我的意思是,这直接转换为https://gist.github.com/lowasser/e1b57e1a9358cbf52cc6 (4认同)
  • 令人讨厌的是,我可以在LINQ中看到我在C#中的确切方式 - 以一种非常通用的方式 - 但我仍然在谈到Java流时.也许当我得到更多的练习...... (3认同)
  • @LouisWasserman让分裂者排列他们的分裂,特别是并行,肯定是一个大问题.另一个问题是你真的希望将两个(或N个)流压缩为另一个流.它的元素类型是什么?一个`Pair`或`Tuple`类?或者提供一个成对组合元素的"BiFunction"?但我们没有N-ary功能.我们仍在努力解决这个问题,但在我们拥有值类型(> Java 9)之前,看起来并不会出现任何问题. (2认同)