文章目录

  • 简介
  • tryAdvance
  • trySplit
  • estimateSize
  • characteristics
  • 举个例子
  • 总结

java 8 stream中的Spliterator简介

简介

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

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

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

default Stream<E> stream() {return StreamSupport.stream(spliterator(), false);}
default Stream<E> 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
public class CustBook {private String name;}

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

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

    public static List<CustBook> generateElements() {return Stream.generate(() -> new CustBook("cust book")).limit(1000).collect(Collectors.toList());}

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

    public String call(Spliterator<CustBook> spliterator) {int current = 0;while (spliterator.tryAdvance(a -> a.setName("test name".concat("- add new name")))) {current++;}return Thread.currentThread().getName() + ":" + current;}

最后,写一下测试方法:

    @Testpublic void useTrySplit(){Spliterator<CustBook> split1 = SpliteratorUsage.generateElements().spliterator();Spliterator<CustBook> 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,讨论了它的构成,并举例说明,希望大家能够掌握。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/Spliterator

更多精彩内容且看:

  • 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
  • Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  • Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
  • java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程

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

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

  1. java spliterator_java 8 stream中的Spliterator简介

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

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

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

  3. java flatmapfunction_Java Stream中map和flatMap方法

    最近看到一篇讲stream语法的文章,学习Java中map()和flatMap()方法之间的区别. 虽然看起来这两种方法都做同样的事情,都是做的映射操作,但实际上差之毫厘谬以千里. 通过演示Demo中 ...

  4. 技巧 | Java 8 Stream 中异常处理的4种方式

    Stream API 和 lambda 是 Java8以来对Java的重大改进.从那时起,我们可以使用更具有功能性的语法风格的代码.但是有个问题就是,我们使用了 lambda 表达式,那 lambda ...

  5. java world_Java World中的GraphQL简介

    java world 许多人认为GraphQL仅适用于前端和JavaScript,它在Java等后端技术中不占优势,但事实确实如此. 还经常将GraphQL与REST进行比较,但是这种比较是否合理? ...

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

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

  7. Java 8 Stream 流用法及语法

    Java 8 Stream 流用法 1.简介 Stream流 最全的用法 Stream 能用来干什么?用来处理集合,通过 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据 ...

  8. java 8——Stream

    Part 1 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一部分,话不多说,直奔主题. 什么是流API? 它能做一些什么? ...

  9. 图说Stream中的skip()和limit()方法及组合使用

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

最新文章

  1. 提高oracle查询效率
  2. php转义和去掉html、php标签函数
  3. pix2pix 学习笔记
  4. 上两个月,15家面试,几个offer , 我的面试历程!
  5. MySql查询语句中解决“该列没有包含在聚合函数或者groupby子句中”的相关问题方法...
  6. Exchange 2010安装必要条件
  7. hdu_4742_Pinball Game 3D(cdq分治+树状数组)
  8. 三农数据(1996-2020)五:农产品产量、就业人数、农村养老等
  9. 地学计算方法/地统计学(5第五章 空间插值与克里格法)
  10. 旧文重发:从第三方服务角度看各公司技术部门如何正确计算投入产出比~
  11. Please use torch.load with map_location=torch.device(‘cpu‘),If you are running on a CPU-only machine
  12. 150. Evaluate Reverse Polish Notation逆波兰表达式
  13. 惠普台式电脑引导不了系统_惠普(HP)电脑安装不了GHOST系统的解决方法
  14. Excel快速合并多行数据
  15. js中怪异的this 指针
  16. 下载原版百度文库资料
  17. ArrayDeque(双端队列的线性实现)详解
  18. STM32——打地鼠
  19. 值得一生去看的21个演讲,8部经典励志电影,12部大师纪实片,60部纪录片
  20. MP4视频文件过大压缩的技巧是什么?简单步骤讲解

热门文章

  1. 1006. Sign In and Sign Out (25)
  2. 使用VLC和live555MediaServer搭建RTSP服务器
  3. 数据结构与算法 | 顺序表
  4. Charles+Android模拟器里抓http请求(配置模拟器教程)
  5. X-Y PROBLEM
  6. Spectre CPU漏洞借着BPF春风卷土重来
  7. [Kafka与Spark集成系列三] Spark编程模型
  8. 使用VMware VSphere WebService SDK进行开发 (四)——获取集群(Cluster, ComputeResource)的相关信息
  9. 使用VMware VSphere WebService SDK进行开发 (三)——获取主机(HostSystem)的基本信息
  10. 曹大带我学 Go(10)—— 如何给 Go 提性能优化的 pr