1 简介
本文将讲解Java 8 Stream中的两个方法:skip()
和limit()
。这两个方法是Stream
很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList
和分页等。
2 skip()方法
见名知义,skip()
方法用于跳过前面n个元素,然后再返回新的流,如图所示:
![d3394d72dc70d67de9a5b89518a0a954.png](https://i-blog.csdnimg.cn/blog_migrate/74cb71d107a37f541c1f05c4f4db5d78.png)
来看看代码:
List<Integer> result = Stream.of(1, 2, 3, 4, 5, 6)
.skip(4)
.collect(Collectors.toList());
List<Integer> expected = asList(5, 6);
assertEquals(expected, result);
方法skip()
的参数n的四种情况:
(1)当n<0
时,抛IllegalArgumentException
异常;
(2)当n=0
时,相当没有跳过任何元素,原封不动、完璧归赵;
(3)当0<n<length
时,跳过n个元素后,返回含有剩下的元素的流;
(4)当n>=length
时,跳过所有元素,返回空流。
3 limit()方法
对于limit()
方法,它是用于限制流中元素的个数,即取前n个元素,返回新的流,如图所示:
![e10895ba0e43c24e4962e0b6bb65a55e.png](https://i-blog.csdnimg.cn/blog_migrate/099273f74f4454c8e82a98158a27aef9.png)
代码如下:
List<Integer> result = Stream.of(1, 2, 3, 4, 5, 6)
.limit(4)
.collect(Collectors.toList());
List<Integer> expected = asList(1, 2, 3, 4);
assertEquals(expected, result);
方法limit()
的参数n的四种情况:
(1)当n<0
时,抛IllegalArgumentException
异常;
(2)当n=0
时,不取元素,返回空流;
(3)当0<n<length
时,取前n个元素,返回新的流;
(4)当n>=length
时,取所有元素,原封不动、完璧归赵。
4 对无限流的操作
流Stream分为有限流和无限流,前面的例子我们都是使用的有限流,与Java集合类不同,流是可以无限的。对于无限流,skip()
和limit()
表现出了极大的差异,先上代码:
Stream.iterate(1, i -> i + 1)
.filter(num -> (num & (num - 1)) == 0)
.limit(10)
.forEach(System.out::println);
System.out.println("----------------");
Stream.iterate(1, i -> i + 1)
.filter(num -> (num & (num - 1)) == 0)
.skip(10)
.forEach(System.out::println);
执行后发现,limit()
是可以将无限流转化为有限流的,所以我们也可以认为它是一个短路操作。而skip()
则不行,不管你跳过了前面多少个元素,总还是会有源源不断的元素过来,无法收敛。
上述代码的结果是:
通过limit()
输出了前十个2的n次方值:
1, 2, 4, 8, 16, 32, 64, 128, 256, 512
而skip()
跳过了前10个,继续输出,但会不断执行下去(会有int的溢出现象):
1024, 2048, 4096, 8192, 16384, 32768...
5 组合应用
除了两者各自有各自的功能外,我们通过组合使用,可以实现其它功能。
5.1 与subList的替换
集合类如List
是有subList()
这个方法的,可以截取List中的某一部分,这个功能还可以通过组合skip()
和limit()
使用得到,如下面代码:
List<Integer> list = asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
List<Integer> expected = list.subList(3, 7);
List<Integer> result = list.stream()
.skip(3)
.limit(7 - 3)
.collect(Collectors.toList());
assertEquals(expected, result);
将subList(startIndex, endIndex)
转换成skip(startIndex).limit(endIndex - startIndex)
。
5.2 分页
可以通过组合使用skip()
和limit()
进行分页,如下面代码:
int pageSize = 10;
int pageIndex = 7;
List<Integer> expected = asList(61, 62, 63, 64, 65, 66, 67, 68, 69, 70);
List<Integer> result = Stream.iterate(1, i -> i + 1)
.skip((pageIndex - 1) * pageSize)
.limit(pageSize)
.collect(Collectors.toList());
assertEquals(expected, result);
上面代码例子是获取了第七页数据,每页大小为10。
6 总结
本文介绍了Java 8的Stream
接口中两个常用的方法:skip()
和limit()
,比较简单易懂,也介绍了怎么组合使用。需要注意的是,如果Stream
过大或是无限流,小心skip()
会有性能问题。
欢迎关注公众号<南瓜慢说>,将持续为你更新...
![c49b5b7425a0c51532633213ca704b0f.png](https://i-blog.csdnimg.cn/blog_migrate/31eb22f2fd0bfe805ddaaf41920b4652.jpeg)
欢迎加博主微信,做一个点赞之友,哈哈...
![ff8bd725be3b7ee79badc9eca832e9c9.png](https://i-blog.csdnimg.cn/blog_migrate/4c9be659f7bf5304b2dfddd1be167c90.jpeg)
多读书,多分享;多写作,多整理。
Springboot:
【Springboot】Springboot整合邮件服务(HTML/附件/模板-QQ、网易)
【Springboot】Springboot整合Jasypt,让配置信息安全最优雅方便的方式
【Springboot】用Springboot Admin监控你的微服务应用
Java必修课:
【Java必修课】通过Value获取Map中的键值Key的四种方法
【Java必修课】HashMap性能很好?问过我EnumMap没
【Java必修课】String.intern()原来还能这么用(原理与应用)
【Java必修课】Java 8之条件断言Predicate的使用
【Java必修课】一图说尽排序,一文细说Sorting(Array、List、Stream的排序)
【Java必修课】好用的Arrays.asList也有这三个坑
【Java必修课】ArrayList与HashSet的contains方法性能比较(JMH性能测试)
【Java必修课】各种集合类的合并(数组、List、Set、Map)
【Java必修课】四类方法删除List里面的所有null值
【Java必修课】Java 8 Streams的简单介绍与入门
【Java必修课】Java 8基本类型的Stream
【Java必修课】Java 8之例说Stream的合并
【Java必修课】Java双大括号{}的初始化
【Java必修课】Java 8中map()与flatMap()在Optional和Stream中的区别
【Java必修课】如何创建和初始化一个HashMap?
Java实例:
【Java实例】使用Thumbnailator生成缩略图(缩放、旋转、裁剪、水印)
【Java实例】统计String单词数的三种方法
【Java实例】使用正则统计英文文章中的高频词汇
MongoDB:
【MongoDB】2019年MongoDB中文社区广州大会,干货满满的分享活动
【MongoDB】用Docker安装一个MongoDB最新版玩玩
其它:
【工具】带你飞起来的好工具Everything,极速找到你所要的文件
【运维】记一次上线前的紧急定位与修复-献上九条小经验
【Java库】如何使用优秀的加密库Jasypt来保护你的敏感信息?
【Spring】Spring的定时任务注解@Scheduled原来如此简单