Stream skip(long n)
返回一个新的stream,该stream包含原stream中跳过前n个元素后的所有元素。如果原stream中的元素数量小于n则返回一个空的stream。
和limit方法的区别,skip是指新流包含跳过原流中前n个元素后的全部元素,这是个有状态的中间操作,必须要处理整个输入元素才能产生最终结果,而limit是指取原流中前n个元素放进新流中返回,这是个短路的中间操作,无须处理完全部输入操作即可终止操作获得最终返回结果。比如limit用在处理无限流的截取操作,只要获得指定数量的输入元素就终止无限流的输入。关于limit方法的使用可以参看18章。
Skip方法示例:
void stream_skip() {
Stream.of(1,2,3,4,5,6,7,8).skip(5).forEach(System.out::print);
}
运行结果:
678
上例中使用skip(5)直接跳过原流中前5个元素,把之后的3个元素放到新流中返回。
以上返回结果是有序流中执行的结果,如果是有序并行流的返回结果就会出现无法预料的顺序,如下示例:
void stream_skip() {
Stream.of(1,2,3,4,5,6,7,8).skip(3).forEach(System.out::print);
System.out.println("\n------ ");
List.of(1,2,3,4,5,6,7,8).parallelStream().skip(3).forEach(System.out::print);
}
运行结果:
45678
------
65784
Skip配合limit和collect这两个方法可以很容易对集合中的元素实现分页操作,如下代码示例:
List pagelist = list.stream().skip(pageSize*i).
limit(pageSize).
collect(Collectors.toList());
这算是一个很好很实用的应用。