java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用

1 简介

本文将讲解Java 8 Stream中的两个方法:skip()和limit()。这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和分页等。

2 skip()方法

见名知义,skip()方法用于跳过前面n个元素,然后再返回新的流,如图所示:

e8d0c83fedf40b618ac025919274cef5.png

来看看代码:

List result = Stream.of(1, 2, 3, 4, 5, 6)

.skip(4)

.collect(Collectors.toList());

List expected = asList(5, 6);

assertEquals(expected, result);

方法skip()的参数n的四种情况:

(1)当n<0时,抛IllegalArgumentException异常;

(2)当n=0时,相当没有跳过任何元素,原封不动、完璧归赵;

(3)当0

(4)当n>=length时,跳过所有元素,返回空流。

3 limit()方法

对于limit()方法,它是用于限制流中元素的个数,即取前n个元素,返回新的流,如图所示:

272cd08b44858e630856565c8b563421.png

代码如下:

List result = Stream.of(1, 2, 3, 4, 5, 6)

.limit(4)

.collect(Collectors.toList());

List expected = asList(1, 2, 3, 4);

assertEquals(expected, result);

方法limit()的参数n的四种情况:

(1)当n<0时,抛IllegalArgumentException异常;

(2)当n=0时,不取元素,返回空流;

(3)当0

(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 list = asList(1, 2, 3, 4, 5, 6, 7, 8, 9);

List expected = list.subList(3, 7);

List 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 expected = asList(61, 62, 63, 64, 65, 66, 67, 68, 69, 70);

List 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怎么调用子类中父类被覆盖的方法

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&period;util&period;Stack类中的peek&lpar;&rpar;方法

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

JDK1&period;8新特性&lpar;一&rpar; ----Lambda表达式、Stream API、函数式接口、方法引用

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

疯狂java学习笔记之面向对象&lpar;六&rpar; - 构造器重载、方法重载和方法重写

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

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

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

java 8 stream中的Spliterator简介

目录 简介 tryAdvance trySplit estimateSize characteristics 举个例子 总结 java 8 stream中的Spliterator简介 简介 Split ...

java stream中Collectors的用法

目录 简介 Collectors.toList() Collectors.toSet() Collectors.toCollection() Collectors.toMap() Collectors ...

随机推荐

Notes on &&num;39&semi;Efficient Graph-Based Image Segmentation&&num;39&semi;

Notes on Efficient Graph-Based Image Segmentation 算法的目标 按照一种确定的标准, 将图片分割成细粒度的语义区域, 即Super pixel. 算法步 ...

禁止使用finalize方法

Don´t use Finalizers, mainly because are unpredictable and we don´t know when will be executed, &quo ...

【Todo】Java Queue Stack Vector ArrayList

Java集合框架里存在Queue这个接口,之后有不同类型的队列的实现. 有Stack这个类实现堆栈,其实这个类是通过继承Vector的方式来实现的, Vector和ArrayList的实现方式差不多, ...

git 常用命令 创建查看删除分支,创建查看删除tag等

1. git 文档 https://github.com/progit/progit/blob/master/zh/02-git-basics/01-chapter2.markdown https ...

html、body、document、window的区别

html是一门超文本标记语言: document对象代表整个html文档,可用来访问页面中的所有元素: body代表document的主体子对象,除浏览器头部,页面中能够看到的内容都属于body中的内 ...

java bootstrap分页

样式如下 datumMap.total总共多少页 datumMap.page第几页

MongoDB3&period;4 shell CRUD操作

输入db,显示你正在操作的数据库:切换数据库,输入use dbName,如果数据库不存在的话会自动帮我们创建一个:使用show dbs可以显示所有可用的数据库. 测试数据在文末 插入文档 插入操作的行 ...

sed武功心法&lpar;info sed翻译&plus;注解&rpar;

本文中的提到GNU扩展时,表示该功能是GNU为sed提供的(即GNU版本的sed才有该功能),一般此时都会说明:如果要写具有可移植性的脚本,应尽量避免在脚本中使用该选项. 本文中的正则表达式几乎和gr ...

C&plus;&plus; 子类继承父类纯虚函数、虚函数和普通函数的区别

C++三大特性:封装.继承.多态,今天给大家好好说说继承的奥妙 1.虚函数: C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现.子类可以重写父类的虚函数实现子类 ...

Player启动时提示 &quot&semi;System&period;InvalidOperationException&colon;无法加载计数器名称数据

问题 播放器意外断电重启后可能导致Player启动时报错,提示如下: 原因 这个提示一般指 Universal Player 找不到或无法设置一个Windows Performance Monitor ...

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值