如何使用Java中的lambda函数对每列和每行的列表列表求和?
发布时间:2020-05-28 22:51:38 所属栏目:Java 来源:互联网
导读:我有一个这样的列表列表: ListListWrapper listOfLists = new ArrayList();class Wrapper { private int value = 0; public int getValue() { return value; }} 看起来像这样: [[Wrapper(3), Wrapper(4), Wr
|
我有一个这样的列表列表: 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)] 它似乎比以下更复杂: 我最初的做法与列表类似: 谢谢! 解决方法每行实际上非常简单: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());
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
