例如,我有一个整数列表,例如List(1,2,3,4,5,6,7)
我想以Java 8的所有功能性方式来获取连续3个数字的所有组合,以学习Java8。(我知道如何以命令式的方式进行操作)
因此,上面的结果可以是以下列表的列表:
List(List(1,2,3), List(2,3,4), List(3,4,5), List(4,5,6), List(5,6,7))
谢谢
答案 0 :(得分:6)
您可以在迭代时使用List.subList
来完成此操作:
final int subListSize = 3;
List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7);
List<List<Integer>> sublists = IntStream.rangeClosed(0, list.size() - subListSize)
.mapToObj(i -> list.subList(i, i + subListSize))
.collect(Collectors.toList());
答案 1 :(得分:4)
您也可以使用jOOλ库及其Seq.sliding()
方法(Seq
是连续的Stream
)来做到这一点:
List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7);
List<List<Integer>> sublists = Seq.seq(list)
.sliding(3)
.map(Collectable::toList)
.toList();
产生:
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]]
请注意:
ArrayList
)List<List<T>> sublists(List<T> list, int sublistSize)
的函数中list
,而nullpointer's是原始list
的 views 的列表
list
或创建的sublists
之后都不会被修改,因此这无关紧要(并且对性能有好处)list
中删除元素,甚至会中断).map(List::copyOf)
之后添加一个额外的mapToObj
(如果您希望得到可变的结果,则添加.map(ArrayList::new)
)