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()方法及组合使用的更多相关文章

  1. 【Java 8】Stream中的Pipeline理解

    基于下面一段代码: public static void main(String[] args) { List<String> list = Arrays.asList("123 ...

  2. 【Java 8】Stream中flatMap方法

    在java 8 Stream中,flatMap方法是一个维度升降的方法 举例说明 给 定 单 词 列 表["Hello","World"] ,要返回列表 [&q ...

  3. java怎么调用子类中父类被覆盖的方法

    public class b { { void show() { System.out.println("b"); } } public class c extends b { v ...

  4. java获取properties配置文件中某个属性最简单方法

    假如我想获取src目录下sysConfig.properties中的uploadpath属性的值 方法如下所示: private static final ResourceBundle bundle ...

  5. 我要告诉你:java接口中可以定义private私有方法

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  6. java.util.Stack类中的peek()方法

    java.util.stack类中常用的几个方法:isEmpty(),add(),remove(),contains()等各种方法都不难,但需要注意的是peek()这个方法. peek()查看栈顶的对 ...

  7. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  8. 疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写

    一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同 ...

  9. 【Java必修课】通过Value获取Map中的键值Key的四种方法

    1 简介 我们都知道Map是存放键值对<Key,Value>的容器,知道了Key值,使用方法Map.get(key)能快速获取Value值.然而,有的时候我们需要反过来获取,知道Value ...

随机推荐

  1. Mac下载ChromeDriver

    ChromeDriver下载地址: https://npm.taobao.org/mirrors/chromedriver 如何查看chrome版本与ChromeDriver版本对应 查看chrome ...

  2. PostGIS 结合Openlayers以及Geoserver实现最短路径分析(三)

    接上篇,前面在ArcMap中和Postgis中将数据都已经进行了预处理. 接下来回到Geoserver中,进行数据发布. 1.新建工作区 2.填写完工作区信息 3.打开数据存储,添加新的数据存储 4. ...

  3. 20191031-3 beta week 1/2 Scrum立会报告+燃尽图 01

    此作业要求参见[https://edu.cnblogs.com/campus/nenu/2019fall/homework/9911] 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 ...

  4. wordpress小程序安装教程

    推荐服务器特价优惠注册即可购买,1G双核一年只要88,真的是白菜价格,点击下面图片即可进入购买地址. 开源小程序发布一段时间了,很多人最近咨询了关于小程序的教程,实在太忙了,抽空写个基本的安装教程. ...

  5. 驰骋工作流系统-Java共工作流引擎配置定时任务

    关键词:工作流定时任务  流程引擎定时任务设置  工作流系统定时任务配置  开源工作流引擎 开源工作流系统 一.定时任务的作用 发送邮件,发送短信. 处理节点自动执行的任务.比如:一个节点的待办工作是 ...

  6. [UWP]UIElement.Clip虽然残废,但它还可以这样玩

    1. 复习一下WPF的UIElement.Clip 用了很久很久的WPF,但几乎没有主动用过它的Clip属性,我只记得它很灵活,可以裁剪出多种形状.在官方文档复习了一下,大致用法和效果如下: < ...

  7. 盒模型 | CSS权重 | CSS层叠

    span{ color:red;} *{ font-family:"楷体";line-height:2em; font-size:18px;} 盒模型 CSS定义所有的元素都可能拥 ...

  8. 品优购详情页---产品细节模块product_detail

    结构搭建 整个大盒子产品细节模块命名为: product_detail(不给高度,注意清除浮动带来的影响) 1号盒子命名为:aside(左侧浮动,有宽带不给高度) 2号盒子命名为:detail(右侧浮 ...

  9. Ztree树增删改查菜单,遇到的问题总结

    一.引言 我今天做了一个Ztree树增删改查菜单的功能.其中遇到了很多坑爹的问题,和大家讲述一下. 二.代码展示 1.Ztree树前台代码 <%@ page language="jav ...

  10. mac 终端高亮显示~

    针对terminal采用bash模式: 编辑 ~/.bash_profile, 加入以下代码: export CLICOLOR=1 export LSCOLORS=gxfxaxdxcxegedabag ...