加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 03:15:00 所属栏目:Java 来源:网络整理
导读:我有一个这样的列表列表: ListListWrapper 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)],[W
我有一个这样的列表列表:
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(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 Lambdas

3 ways to flatten a list of lists. Is there a reason to prefer one of them?

我最初的做法与列表类似:
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());
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读