在Java中使用Spliterator
介绍:
Java中的迭代器用于遍历给定源的元素。 Java中的Spliterator是四个可用的Java迭代器之一-Iterator ,Enumeration, ListIterator和Spliterator 。 它是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)
在Spliterator的tryAdvance()方法结合了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相关推荐
- java 8 stream中的Spliterator简介
文章目录 简介 tryAdvance trySplit estimateSize characteristics 举个例子 总结 java 8 stream中的Spliterator简介 简介 Spl ...
- java spliterator_java 8 stream中的Spliterator简介
java 8 stream中的Spliterator简介 简介 Spliterator是在java 8引入的一个接口,它通常和stream一起使用,用来遍历和分割序列. 只要用到stream的地方都需 ...
- Java中lambda表达式去重_JAVA8中Lambda和Stream
Java8于2014年3月份发布,其主要更新的特性有:函数式接口.Lambda 表达式.集合的流式操作.注解的更新.安全性的增强.IO\NIO 的改进.完善的全球化功能等,本文将介绍Lambda表达式 ...
- 万字长文深入理解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 ...
- java中无限大_Java 9中的无限集
java中无限大 一套 甲Set是元素的集合,从而在任何给定的元件Set只出现一次. 更正式地说,集合不包含元素e1和e2对,因此e1.equals(e2) . 我们可以像这样在Java 9中轻松创建 ...
- java里的stream,Java中的Stream
Stream操作分类 中间操作 中间操作只对操作进行了记录,即只会返回一个流,不会进行计算操作.中间操作可以分为有状态和无状态两种情况: 有状态:元素的处理必需要拿到前面所有的元素才能够进行下去. 无 ...
- java中hashset_Java HashSet – Java中的HashSet
java中hashset Java HashSet is the most popular implementation of Set interface. java.util.HashSet is ...
- Java中哈希集(HashSet)概念,实现以及操作
Java中HashSet的用法 1. HashSet概念 2.Java文档中HashSet的实现 3.HashSet的构造函数 3.1 HashSet() 3.2 HashSet(int initia ...
- 如何在 Java 中实现最小生成树算法
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
最新文章
- Python中的多线程编程
- python非法语句是_python 如何优雅的处理大量异常语句?
- switch一定比if else好用吗
- 知识点笔记(二维数组排序、统计数组重复个数、)
- pythonjs语法_javascript基础语法(上)
- Django实现websocket完成实时通讯,聊天室,在线客服等
- 像电影里黑客高手一样写代码
- C# 图片反色处理 图片夜间模式
- flowplayer
- 虚拟打印机安装后没了该怎么办
- 个性化域名邮箱的配置云阿里云域名解析详细教程
- Chrome浏览器扩展:bilibili哔哩哔哩视频下载助手 2.1.5_0
- Win7和Win10共享出现没有权限使用网络资源的解决步骤
- [转] 公务员80分申论万能模板(转给需要的人)
- 英语打卡3:可数名词
- 〖Python 数据库开发实战 - Python与MySQL交互篇⑫〗- 项目实战- 实现新闻管理模块
- Element和Node的区别你造吗?
- 如何在LaTex当中给表格命名
- 菜农“中国象棋数字编码”骗婚记
- 过程计算机控制综合课程设计,计算机控制技术综合课程设计.doc