Java - 使用流转置列表列表

时间:2018-03-20 15:28:54

标签: java list stream

出于改进目的,我试图使用专门的流来转置列表列表。

我的意思是,我有一个双打列表列表,其中包含例如

1 2 3 4
5 6 7 8

我想获得一份包含

的双打一览表
1 5
2 6
3 7
4 8

以下Stack Overflow问题中提供了迭代方法:How to transpose List<List>?

到目前为止我只想到了丑陋的解决方案,比如用一个自定义对象替换Double,该对象保存列表中的值和索引,使用flatMap展平,使用groupBy再次使用我保存的索引构建它然后去回到双打。

如果您知道任何干净的方式,请告诉我。感谢。

1 个答案:

答案 0 :(得分:3)

我喜欢你的问题!只要List是正方形(每List包含相同数量的元素),这是实现它的简单方法:

List<List<Integer>> list = List.of(List.of(1, 2, 3, 4), List.of(5, 6, 7, 8));

IntStream.range(0, list.get(0).size())
         .mapToObj(i -> list.stream().map(l -> l.get(i)).collect(Collectors.toList()))
         .collect(Collectors.toList());

以上代码返回以下内容:

[[1, 5], [2, 6], [3, 7], [4, 8]]

注意:这对大型列表效果不佳。