java 8 stream中的Spliterator简介

简介

Spliterator是在java 8引入的一个接口,它通常和stream一起使用,用来遍历和分割序列。

只要用到stream的地方都需要Spliterator,比如List,Collection,IO channel等等。

我们先看一下Collection中stream方法的定义:

default Stream stream() {

return StreamSupport.stream(spliterator(), false);

}

default Stream parallelStream() {

return StreamSupport.stream(spliterator(), true);

}

我们可以看到,不管是并行stream还是非并行stream,都是通过StreamSupport来构造的,并且都需要传入一个spliterator的参数。

好了,我们知道了spliterator是做什么的之后,看一下它的具体结构:

spliterator有四个必须实现的方法,我们接下来进行详细的讲解。

tryAdvance

tryAdvance就是对stream中的元素进行处理的方法,如果元素存在,则对他进行处理,并返回true,否则返回false。

如果我们不想处理stream后续的元素,则在tryAdvance中返回false即可,利用这个特征,我们可以中断stream的处理。这个例子我将会在后面的文章中讲到。

trySplit

trySplit尝试对现有的stream进行分拆,一般用在parallelStream的情况,因为在并发stream下,我们需要用多线程去处理stream的不同元素,trySplit就是对stream中元素进行分拆处理的方法。

理想情况下trySplit应该将stream拆分成数目相同的两部分才能最大提升性能。

estimateSize

estimateSize表示Spliterator中待处理的元素,在trySplit之前和之后一般是不同的,后面我们会在具体的例子中说明。

characteristics

characteristics表示这个Spliterator的特征,Spliterator有8大特征:

public static final int ORDERED = 0x00000010;//表示元素是有序的(每一次遍历结果相同)

public static final int DISTINCT = 0x00000001;//表示元素不重复

public static final int SORTED = 0x00000004;//表示元素是按一定规律进行排列(有指定比较器)

public static final int SIZED = 0x00000040;//

表示大小是固定的

public static final int NONNULL = 0x00000100;//表示没有null元素

public static final int IMMUTABLE = 0x00000400;//表示元素不可变

public static final int CONCURRENT = 0x00001000;//表示迭代器可以多线程操作

public static final int SUBSIZED = 0x00004000;//表示子Spliterators都具有SIZED特性

一个Spliterator可以有多个特征,多个特征进行or运算,最后得到最终的characteristics。

举个例子

上面我们讨论了Spliterator一些关键方法,现在我们举一个具体的例子:

@AllArgsConstructor

[@Data](https://my.oschina.net/difrik)

public class CustBook {

private String name;

}

先定义一个CustBook类,里面放一个name变量。

定义一个方法,来生成一个CustBook的list:

public static List generateElements() {

return Stream.generate(() -> new CustBook("cust book"))

.limit(1000)

.collect(Collectors.toList());

}

我们定义一个call方法,在call方法中调用了tryAdvance方法,传入了我们自定义的处理方法。这里我们修改book的name,并附加额外的信息。

public String call(Spliterator spliterator) {

int current = 0;

while (spliterator.tryAdvance(a -> a.setName("test name"

.concat("- add new name")))) {

current++;

}

return Thread.currentThread().getName() + ":" + current;

}

最后,写一下测试方法:

[@Test](https://my.oschina.net/azibug)

public void useTrySplit(){

Spliterator split1 = SpliteratorUsage.generateElements().spliterator();

Spliterator split2 = split1.trySplit();

log.info("before tryAdvance: {}",split1.estimateSize());

log.info("Characteristics {}",split1.characteristics());

log.info(call(split1));

log.info(call(split2));

log.info("after tryAdvance {}",split1.estimateSize());

}

运行的结果如下:

23:10:08.852 [main] INFO com.flydean.SpliteratorUsage - before tryAdvance: 500

23:10:08.857 [main] INFO com.flydean.SpliteratorUsage - Characteristics 16464

23:10:08.858 [main] INFO com.flydean.SpliteratorUsage - main:500

23:10:08.858 [main] INFO com.flydean.SpliteratorUsage - main:500

23:10:08.858 [main] INFO com.flydean.SpliteratorUsage - after tryAdvance 0

List总共有1000条数据,调用一次trySplit之后,将List分成了两部分,每部分500条数据。

注意,在tryAdvance调用之后,estimateSize变为0,表示所有的元素都已经被处理完毕。

再看一下这个Characteristics=16464,转换为16进制:Ox4050 = ORDERED or SIZED or SUBSIZED 这三个的或运算。

这也是ArrayList的基本特征。

总结

本文介绍了跟stream息息相关的接口Spliterator,讨论了它的构成,并举例说明,希望大家能够掌握。

欢迎关注我的公众号:程序那些事,更多精彩等着您! 更多内容请访问 www.flydean.com

java spliterator_java 8 stream中的Spliterator简介相关推荐

  1. java 8 stream中的Spliterator简介

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

  2. java 声明数组_Java中的数组简介

    对于Java来说,如果需要用一种数据结构来保存若干个同类型的元素,那么可以选择使用数组. 所谓数组就是用来保存若干个同类型的数据元素,在Java中也可以认为数据元素就是对象.也就是说,只要给定了一个数 ...

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

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

  4. java 8 lambda表达式中的异常处理

    文章目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,l ...

  5. 在Java中使用Spliterator

    介绍: Java中的迭代器用于遍历给定源的元素. Java中的Spliterator是四个可用的Java迭代器之一-Iterator ,Enumeration, ListIterator和Splite ...

  6. java stream中Collectors的用法

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

  7. java 8 Stream中操作类型和peek的使用

    文章目录 简介 中间操作和终止操作 peek 结论 java 8 Stream中操作类型和peek的使用 简介 java 8 stream作为流式操作有两种操作类型,中间操作和终止操作.这两种有什么区 ...

  8. java里的stream,Java中的Stream

    Stream操作分类 中间操作 中间操作只对操作进行了记录,即只会返回一个流,不会进行计算操作.中间操作可以分为有状态和无状态两种情况: 有状态:元素的处理必需要拿到前面所有的元素才能够进行下去. 无 ...

  9. Java 8系列之Stream中万能的reduce

    Stream系列: Java 8系列之Stream的基本语法详解 Java 8系列之Stream的强大工具Collector Java 8系列之重构和定制收集器 Java 8系列之Stream中万能的 ...

最新文章

  1. 尝试Java,从入门到Kotlin(上)
  2. 56岁潘石屹报名全国青少年编程能力等级测试,昔日地产大亨,今陷Python难抽身...
  3. B/S项目结束,又是一个新的开始
  4. [PAT乙级]1036 跟奥巴马一起编程
  5. 主板螺丝是机箱配还是主板配_要配新电脑,A520主板和B450主板哪一个更加值得购买?...
  6. 在考生文件夹存有JAVA3_注意:下面出现的“考生文件夹”均为%USER%在考生文件夹下存有文件名为J_网考网(Netkao.com)...
  7. python turtle绘制柱状图_python绘制图形(Turtle模块)
  8. 第六次程序设计作业 计算器图型界面的设计
  9. 爆料称华为P50系列即将进入量产 或将于下月发布
  10. 路由器和交换机的区别,太经典了
  11. ofdm原理_5G进行时|5G NR物理层详解:原理、模型和组件
  12. RESCN.NET全站系统 [重量级全源码发布][原创]
  13. 打印机与计算机无法进行通讯,打印时电脑提示:“打印机不能与计算机进行通讯”是为什么啊?是电脑出现问题还是打印机出现问题了?...
  14. DCGM-Exporter 安装 显卡监控 Prometheus
  15. 《520婚恋报告》 20%的人婚后都无比后悔
  16. 《Mini-Me: An Adaptive Avatar for Mixed Reality Remote Collaboration》论文笔记
  17. ionic安卓打印终极解决方案,支持USB打印
  18. pool(二)——动手入门
  19. hibernate完整jar包下载
  20. 计算机修改users用户名,笔记本电脑更改用户名_笔记本电脑更改user

热门文章

  1. 又有大动作?Pokémon Go开发商Niantic收购AR开发平台8th Wall,达成迄今为止金额最大的一笔收购
  2. 这一次,苹果、Google、微软选择了统一战线!
  3. 硬核!如何全面系统地自学 Java ?
  4. “我辞退了一位学位学历造假的程序员“
  5. 年终福利 | “社区之星”(年度贡献者)成长故事征集
  6. IEEE 迎来首位华人主席,马里兰大学终身教授刘国瑞当选
  7. 用 AI 培养孩子学习兴趣,讯飞新一代智能学习机正式发布!
  8. 看这篇就够了!一文读懂拜占庭将军问题
  9. 什么程度才算精通 Linux?
  10. 科技界流传的 OKR 系统有用吗?