【Java必修课】图说Stream中的skip()和limit()方法及组合使用
1 简介
本文将讲解Java 8 Stream中的两个方法:skip()
和limit()
。这两个方法是Stream
很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList
和分页等。
2 skip()方法
见名知义,skip()
方法用于跳过前面n个元素,然后再返回新的流,如图所示:
来看看代码:
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个元素,返回新的流,如图所示:
代码如下:
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()
会有性能问题。
欢迎关注公众号<南瓜慢说>,将持续为你更新...
欢迎加博主微信,做一个点赞之友,哈哈...
多读书,多分享;多写作,多整理。
【Java必修课】图说Stream中的skip()和limit()方法及组合使用的更多相关文章
- 【Java 8】Stream中的Pipeline理解
基于下面一段代码: public static void main(String[] args) { List<String> list = Arrays.asList("123 ...
- 【Java 8】Stream中flatMap方法
在java 8 Stream中,flatMap方法是一个维度升降的方法 举例说明 给 定 单 词 列 表["Hello","World"] ,要返回列表 [&q ...
- java怎么调用子类中父类被覆盖的方法
public class b { { void show() { System.out.println("b"); } } public class c extends b { v ...
- java获取properties配置文件中某个属性最简单方法
假如我想获取src目录下sysConfig.properties中的uploadpath属性的值 方法如下所示: private static final ResourceBundle bundle ...
- 我要告诉你:java接口中可以定义private私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- java.util.Stack类中的peek()方法
java.util.stack类中常用的几个方法:isEmpty(),add(),remove(),contains()等各种方法都不难,但需要注意的是peek()这个方法. peek()查看栈顶的对 ...
- JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用
jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default Lambda表达式 L ...
- 疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写
一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同 ...
- 【Java必修课】通过Value获取Map中的键值Key的四种方法
1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...
随机推荐
- 超速入门AT指令集 | 我的物联网成长记
[摘要] 在物联网中,AT命令集可用于控制&调测设备.通信模块入网等.本文为您介绍NB-IoT常用的AT命令集及其调测工具. 什么是AT指令集 AT命令,用来控制TE(Terminal Equ ...
- Siamese-RPN论文阅读
https://www.cnblogs.com/zhengyuqian/p/10609737.html
- python分支循环
1.遍历循环 for i in range(5) for i in range (M,N,K) for c in s: for c in 'python' print(c,end="&quo ...
- Linux LVM 配置
本文出自 “www.kisspuppet.com” 博客,请务必保留此出处http://dreamfire.blog.51cto.com/418026/1084729 许多Linux使用者安装操作系统 ...
- Java并发之synchronized关键字深度解析(一)
前言 近期研读路神之绝世武学,徜徉于浩瀚无垠知识之海洋,偶有攫取吉光片羽,惶恐未领略其精髓即隐入岁月深处,遂急忙记录一二,顺备来日吹cow之谈资.本小系列为并发之亲儿子-独臂狂侠synchronize ...
- 解决配置vim中文乱码的问题
解决linux下vim乱码的情况:(修改vimrc的内容) 全局的情况下:即所有用户都能用这个配置 文件地址:/etc/vimrc 在文件中添加: set fileencodings=utf-8,uc ...
- 1sql
------------------ MySQL 服务-- sudo service mysql start/stop/restart/status ------------------ 数据库相关的 ...
- scrapy抓取中国新闻网新闻
目标说明 利用scrapy抓取中新网新闻,关于自然灾害滑坡的全部国内新闻:要求主题为滑坡类新闻,包含灾害造成的经济损失等相关内容,并结合textrank算法,得到每篇新闻的关键词,便于后续文本挖掘分析 ...
- 九、Spring Boot 优雅的实现CORS跨域
前言 我们的springboot 架手架已经包含了mysql,redis,定时任务,邮件服务,短信服务,文件上传下载,以及docker-compose 构建镜像等等. 接下来让我们解决另一个常见的问题 ...
- 小白的springboot之路(六)、跨域解决方案CORS
0-前言 前后端分离.分布式集群,经常都会涉及到跨域访问,而浏览器基于同源策略,正常情况下是不能跨域的,这就需要我们解决跨域访问问题:spring boot解决跨域也比较简单: 1-CORS跨域解决方 ...