介绍:

Java中的迭代器用于遍历给定源的元素。 Java中的Spliterator是四个可用的Java迭代器之一-Iterator ,Enumeration, ListIteratorSpliterator 它是java.util包中可用的接口。

Spliterator最初是在Java 8中引入的,以支持并行编程。 但是,我们可以将其用于数据项的顺序和并行处理。 要获取Java Spliterator的实例,我们将使用spliterator()方法:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Spliterator splitr = list.spliterator();

我们可以将Java Spliterator视为:

Spliterator = Splitting + Iteration

Spliterator接口定义一些表示其特性的整数常量。 我们的实例可以具有以下八个特征中的一个或多个:

  • SIZED –能够在调用estimateSize()方法时返回源中确切数量的元素
  • SUBSIZED –当我们使用trySplit ()拆分实例并获得SIZED SplitIterators时
  • ORDERED –在有序序列上迭代
  • 分类-遍历一个排序序列
  • NONNULL –源保证不具有
  • DISTINCT-我们的源序列中不存在重复项
  • IMMUTABLE –如果我们无法在结构上修改元素源
  • 并发-元素源可以同时安全地修改

我们可以使用int Characteristics ()方法来查询我们的Spliterator实例的特征。 它为我们的Spliterator返回所有合格特征值的OR'ed值。 对于我们定义的分离器,我们将有:

int charactersticsORed = splitr.characteristics(); //16464

我们可以使用boolean hasCharacteristics(int特征)方法来检查我们的实例是否具有给定的特征

boolean isSized = splitr.hasCharacteristics(Spliterator.SIZED);   //true
boolean isSorted = splitr.hasCharacteristics(Spliterator.SORTED); //false
boolean isNonNull = splitr.hasCharacteristics(Spliterator.NONNULL); //false

estimateSize()方法返回要迭代的剩余元素的估计数量。 如果该值无限大,未知或计算成本太高,则返回Long.MAX_VALUE 。 对于SIZED拆分器,它返回一个值,该值与成功遍历中将遇到的元素数完全对应:

long estimatedSize = splitr.estimateSize(); // 5

这只是一个方便的方法,如果它是SIZED Spliterator或返回-1 ,则返回estimateSize()

long size = splitr.getExactSizeIfKnown(); // 5

tryAdvance()方法的签名如下所示:

default boolean tryAdvance(Consumer<? super T> action)

SpliteratortryAdvance()方法结合了hasNext()next()运营商呈现在碱性迭代器。 因此,如果存在剩余元素,它将对它执行给定的操作,并返回true;否则,返回true。 否则返回false 换句话说,它对序列中的下一个元素执行操作,然后使迭代器前进。

while(splitr.tryAdvance((item) -> System.out.println(item)));

如果我们有ORDERED Spliterator则按遇到顺序对下一个元素执行操作。

forEachRemaining(Consumer <?superT> action)方法在当前线程中按顺序对每个剩余元素执行给定操作,直到所有元素都已处理或该操作引发异常:

splitr.forEachRemaining(item -> System.out.println(item));

当前的默认实现重复调用tryAdvance(),直到返回false为止。

如果可以进行分区,则trySplit()方法将拆分调用方的Spliterator并返回对该Spliterator覆盖元素的引用,该元素从该方法返回后将不被此Spliterator覆盖。 否则,它返回null

因此,在成功拆分之后,原始的Spliterator将在序列的一部分上进行迭代,而返回的Spliterator将在序列的另一部分上进行迭代。

同样,返回的Spliterator包含初始ORDERED Spliterator的元素的严格前缀(例如,在List上)

// trySplit() method over ORDERED splitr
Spliterator<Integer> splitrNew = splitr.trySplit(); // Elements in our splitrNew = {1, 2, 3}
if(splitrNew != null) { splitrNew.forEachRemaining((n) -> System.out.println(n));
} // Elements in our splitr - {4 , 5}
splitr.forEachRemaining((n) -> System.out.println(n));

除非我们原始的Spliterator表示无限序列,否则对trySplit()的重复调用最终必须返回null

如果我们有一个由比较器排序的分隔器,它将返回该比较器。 否则,如果源以自然顺序排序,则返回null对于未分类的源,它将抛出IllegalStateException

因此,对于我们的示例,我们有:

Comparator<Integer> comparator = splitr.getComparator(); //throws IllegalStateException

为什么要使用Spliterator?

Java Spliterator为我们提供了以下优点:

  • 支持并行编程
  • 我们可以将其用于数据项的顺序和并行处理
  • tryAdvance ()方法结合了简单Iterator的next()hasNext()操作,因此提供了更好的性能

同样,重要的是要意识到,分离器对于Collection源和Stream源都可以正常工作,但不适用于Map实现。

结论:

在本文中,我们向您介绍了Java的Spliterator接口。 我们介绍了此界面中可用的不同默认方法以及如何使用它们。

成为第一个发表评论的人。

翻译自: https://www.javacodegeeks.com/2019/04/using-spliterator-java.html

在Java中使用Spliterator相关推荐

  1. java 8 stream中的Spliterator简介

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

  2. java spliterator_java 8 stream中的Spliterator简介

    java 8 stream中的Spliterator简介 简介 Spliterator是在java 8引入的一个接口,它通常和stream一起使用,用来遍历和分割序列. 只要用到stream的地方都需 ...

  3. Java中lambda表达式去重_JAVA8中Lambda和Stream

    Java8于2014年3月份发布,其主要更新的特性有:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等,本文将介绍Lambda表达式 ...

  4. 万字长文深入理解java中的集合-附PDF下载

    文章目录 1. 前言 2. List 2.1 fail-safe fail-fast知多少 2.1.1 Fail-fast Iterator 2.1.2 Fail-fast 的原理 2.1.3 Fai ...

  5. java中无限大_Java 9中的无限集

    java中无限大 一套 甲Set是元素的集合,从而在任何给定的元件Set只出现一次. 更正式地说,集合不包含元素e1和e2对,因此e1.equals(e2) . 我们可以像这样在Java 9中轻松创建 ...

  6. java里的stream,Java中的Stream

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

  7. java中hashset_Java HashSet – Java中的HashSet

    java中hashset Java HashSet is the most popular implementation of Set interface. java.util.HashSet is ...

  8. Java中哈希集(HashSet)概念,实现以及操作

    Java中HashSet的用法 1. HashSet概念 2.Java文档中HashSet的实现 3.HashSet的构造函数 3.1 HashSet() 3.2 HashSet(int initia ...

  9. 如何在 Java 中实现最小生成树算法

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

最新文章

  1. Python中的多线程编程
  2. python非法语句是_python 如何优雅的处理大量异常语句?
  3. switch一定比if else好用吗
  4. 知识点笔记(二维数组排序、统计数组重复个数、)
  5. pythonjs语法_javascript基础语法(上)
  6. Django实现websocket完成实时通讯,聊天室,在线客服等
  7. 像电影里黑客高手一样写代码
  8. C# 图片反色处理 图片夜间模式
  9. flowplayer
  10. 虚拟打印机安装后没了该怎么办
  11. 个性化域名邮箱的配置云阿里云域名解析详细教程
  12. Chrome浏览器扩展:bilibili哔哩哔哩视频下载助手 2.1.5_0
  13. Win7和Win10共享出现没有权限使用网络资源的解决步骤
  14. [转] 公务员80分申论万能模板(转给需要的人)
  15. 英语打卡3:可数名词
  16. 〖Python 数据库开发实战 - Python与MySQL交互篇⑫〗- 项目实战- 实现新闻管理模块
  17. Element和Node的区别你造吗?
  18. 如何在LaTex当中给表格命名
  19. 菜农“中国象棋数字编码”骗婚记
  20. 过程计算机控制综合课程设计,计算机控制技术综合课程设计.doc

热门文章

  1. jquery中对小数进行取整
  2. JDK容器学习之ArrayList:底层存储和动态扩容
  3. 不可不知的Python模块: collections
  4. 虚拟机上安装 Red Hat Enterprise Linux 7 64位
  5. RT/Metro商店应用如何如何获取图片的宽高
  6. 负载均衡器技术 Nginx VS F5 Big-IP
  7. 【转】SQL存储结构(页)
  8. 关于Reapeter的总结
  9. CCNA实验解析——VLAN间的路由的配置
  10. GARFIELD@07-08-2005 DILBERT