如何使用Java中的lambda函数对每列和每行的列表列表求和?

Mic*_*dis 6 java lambda java-8

我有一个这样的列表列表:

List<List<Wrapper>> listOfLists = new ArrayList<>();

class Wrapper {
   private int value = 0;
   public int getValue() {
      return value;
   }
}
Run Code Online (Sandbox Code Playgroud)

看起来像这样:

[
[Wrapper(3), Wrapper(4), Wrapper(5)],
[Wrapper(1), Wrapper(2), Wrapper(9)],
[Wrapper(4), Wrapper(10), Wrapper(11)],
]
Run Code Online (Sandbox Code Playgroud)

有没有一种简洁的方法来使用Java 8中的lambda函数来展平这个列表列表,如下所示:

(per column): [Wrapper(8), Wrapper(16), Wrapper(25)]
(per row): [Wrapper(12), Wrapper(12), Wrapper(25)]
Run Code Online (Sandbox Code Playgroud)

可能它可以使用不同大小的内部列表:

[
[Wrapper(3), Wrapper(5)],
[Wrapper(1), Wrapper(2), Wrapper(9)],
[Wrapper(4)],
]
Run Code Online (Sandbox Code Playgroud)

这将导致:

(per column): [Wrapper(8), Wrapper(7), Wrapper(9)]
(per row): [Wrapper(8), Wrapper(11), Wrapper(4)]
Run Code Online (Sandbox Code Playgroud)

似乎这样复杂得多: 打开列表的列表为列表使用lambda表达式3种方式拉平列表的列表.是否有理由更喜欢其中之一?

我最初的做法与列表类似:https: //stackoverflow.com/a/36878011/986160

谢谢!

Eug*_*ene 7

每行实际上非常简单:

List<Wrapper> perRow = listOfLists.stream()
            .map(x -> x.stream().mapToInt(Wrapper::getValue).sum())
            .map(Wrapper::new)
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

另一方面,每列不是那么简单:

private static List<Wrapper> perColumn(List<List<Wrapper>> listOfList) {
    int depth = listOfList.size();
    int max = listOfList.stream().map(List::size).max(Comparator.naturalOrder()).get();
    return IntStream.range(0, max)
            .map(x -> IntStream.range(0, depth)
                    .map(y -> listOfList.get(y).size() < y ? 0 : listOfList.get(y).get(x).getValue())
                    .sum())
            .mapToObj(Wrapper::new)
            .collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

  • 通过将行映射到IntStream listOfList.stream().map(row - > row.stream().mapToInt(Wrapper :: getValue).sum()).collect(Collectors.toList()),行par可以更直接); 您还可以通过listOfList.size()更改listOfList.stream().count()它更有效 (2认同)
  • `depth = listOfList.size()`? (2认同)