Java 8获取列表连续编号的功能方法

时间:2018-10-31 05:46:21

标签: java java-8 functional-programming

例如,我有一个整数列表,例如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))

谢谢

2 个答案:

答案 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]]

请注意:

  • nullpointer's solution具有更好的性能(未创建新的ArrayList
  • 我的解决方案更具可读性(但您始终可以将nullpointer's提取到类似List<List<T>> sublists(List<T> list, int sublistSize)的函数中
  • 我的解决方案独立于原始list,而nullpointer's是原始list views 的列表
    • 通常,原始list或创建的sublists之后都不会被修改,因此这无关紧要(并且对性能有好处)
    • 但是,如果要进行任何修改,nullpointer's solution将反映这些更改(或者如果从原始list中删除元素,甚至会中断)
    • 为减轻这种情况,请在解决方案中的.map(List::copyOf)之后添加一个额外的mapToObj(如果您希望得到可变的结果,则添加.map(ArrayList::new)