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

标签 java lambda java-8

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

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

class Wrapper {
   private int value = 0;
   public int getValue() {
      return value;
   }
}

看起来像这样:

[
[Wrapper(3), Wrapper(4), Wrapper(5)],
[Wrapper(1), Wrapper(2), Wrapper(9)],
[Wrapper(4), Wrapper(10), Wrapper(11)],
]

在 Java 8 中使用 lambda 函数是否有一种简洁的方法来展平这个列表列表:

(per column): [Wrapper(8), Wrapper(16), Wrapper(25)]
(per row): [Wrapper(12), Wrapper(12), Wrapper(25)]

它可能适用于不同大小的内部列表:

[
[Wrapper(3), Wrapper(5)],
[Wrapper(1), Wrapper(2), Wrapper(9)],
[Wrapper(4)],
]

这将导致:

(per column): [Wrapper(8), Wrapper(7), Wrapper(9)]
(per row): [Wrapper(8), Wrapper(11), Wrapper(4)]

它看起来比下面的要复杂得多: Turn a List of Lists into a List Using Lambdas3 ways to flatten a list of lists. Is there a reason to prefer one of them?

我最初做的类似于 although for lists: https://stackoverflow.com/a/36878011/986160

谢谢!

最佳答案

每行其实很简单:

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

另一方面,每列并不是那么微不足道:

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());
}

关于java - 如何在 Java 中使用 lambda 函数对每列和每行的列表列表求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47174881/

相关文章:

java - 如何使用 Fluent 等待 Listbox WebElement

错误跟踪日志记录的 Java 实现

java - 如何将 LocalDateTime 转换为 `"yyyy-MM-dd'T'HH :mm:ss'Z '"` format

java - 计算并打印排序数组中的三胞胎

java - 无法将 xml 转换为目标文件

c++ - 将 lambda 存储为成员混淆

intellij-idea - Kotlin "expected no parameters"尝试返回内联 lambda 时

java - if 语句替代 Java 8

java - Lambda:使用 Runnable 实例启动的可调用变量

gradle - 如何超越 gradle wsimport 任务 JDK 8 访问限制?