虽然流不是数据存储对象,但是仍然可以使用迭代器来遍历其元素,就如同使用迭代器遍历集合中的元素一样。

流API支持2类迭代器,一类是传统的Iterator,另一类是JDK8新增的Spliterator。



  • 对流使用传统的迭代器

要获得流的迭代器,在流上调用interator()方法,然后调用hasNext()方法和next()方法即可。代码如下:

public static void main(String[] args) throws Exception
{
List<Double> list = new ArrayList<>(4);
list.add(1.1);
list.add(2.5);
list.add(3.0);
list.add(4.8);
Iterator<Double> iterator = list.parallelStream().iterator();
while (iterator.hasNext())
{
System.out.println(iterator.next());
}
}
  • 使用spliterator

这个方法我以前从来没用过,先看一段代码:

public static void main(String[] args) throws Exception
{
List<Double> list = new ArrayList<>(4);
list.add(1.1);
list.add(2.5);
list.add(3.0);
list.add(4.8);
System.out.println("----研究下tryAdvance+forEachRemaining的用法----");
Spliterator<Double> spliterator = list.parallelStream().spliterator();
//while (spliterator.tryAdvance(System.out::println));
//tryAdvance方法是hasNext()和next()方法的结合体
while (spliterator.tryAdvance(System.out::println))
{
System.out.println("下面显示流中剩余的字符串");
//将各个元素作为一个整体来应用操作
spliterator.forEachRemaining(System.out::println);
} System.out.println("------现在来研究下trySplit的拆分----------");
List<Double> list1 = new ArrayList<>(4);
list1.add(1.1);
list1.add(2.5);
list1.add(3.0);
list1.add(4.8);
Spliterator<Double> spliterator1 = list1.parallelStream().spliterator();
//trySplit返回对拆分后的一部分的引用
Spliterator<Double> trySplit1 = spliterator1.trySplit();
if (Objects.nonNull(trySplit1))
{
//访问新的生成的迭代器的一部分元素
trySplit1.forEachRemaining(System.out::println);
} System.out.println("====访问原来的流中剩下的一部分元素=======");
spliterator1.forEachRemaining(System.out::println);
}

关于这几个方法,我们来看下几个重要的API好了:

tryAdvance(Consumer<? super T> action) :对流中的元素进行迭代,只要该方法返回true,就会对下一个元素执行操作,如果该方法返回false,迭代就完成了。可以理解成为interator接口中hasNext和next方法的合并体,而且还提供了迭代性能。



forEachRemaining(Consumer<? super T> action) :将各个元素作为一个整体来应用操作,并不是一次处理一个元素。注意,使用这个方法,不需要提供一个循环来一次处理一个元素。具体看下面的代码:

public static void main(String[] args) throws Exception
{
List<Double> list = new ArrayList<>(4);
list.add(1.1);
list.add(2.5);
list.add(3.0);
list.add(4.8);
list.parallelStream().spliterator().forEachRemaining(System.out::println); System.out.println("这2种效果一样的。。。"); List<Double> list1 = new ArrayList<>(4);
list1.add(1.1);
list1.add(2.5);
list1.add(3.0);
list1.add(4.8);
Spliterator<Double> spliterator = list1.parallelStream().spliterator();
while (spliterator.tryAdvance(System.out::println)); }

trySplit() :它将被迭代的元素划分成2部分,返回其中一部分的Spliterator,另一部分通过原来的Spliterator访问。如果无法拆分调用Spliterator,返回null

流API--流的迭代的更多相关文章

  1. java8-Stream流API

    一回顾与说明 经过前面发布的三章java8的博客,你就懂得了我们为什么要用Lamda表达式,Lamda表达式的原理与函数式接口的关系,从Lamda表达式到方法引用和构造引用. 想要学Stream流你必 ...

  2. Python 完美诠释"高内聚"概念的 IO 流 API 体系结构

    1. 前言 第一次接触 Python 语言的 IO API 时,是惊艳的.相比较其它语言所提供的 IO 流 API . 无论是站在使用者的角度还是站在底层设计者的角度,都可以称得上无与伦比. 很多人在 ...

  3. 响应式流API的构建基础

    下面三个重要的概念是响应式流API的构建基础: 发布者是事件的发送方,可以向它订阅. 订阅者是事件订阅方. 订阅将发布者和订阅者联系起来,使订阅者可以向发布者发送信号. http://www.info ...

  4. 详解ROMA Connect API 流控实现技术

    摘要:本文将详细描述API Gateway流控实现,揭开高性能秒级流控的技术细节. 1.概述 ROMA平台的核心系统ROMA Connect源自华为流程IT的集成平台,在华为内部有超过15年的企业业务 ...

  5. Java 基础 IO流(转换流,缓冲)

    一,前言 在学习字符流(FileReader.FileWriter)的时候,其中说如果需要指定编码和缓冲区大小时,可以在字节流的基础上,构造一个InputStreamReader或者OutputStr ...

  6. java 文件字节和字符流 缓冲流

    流的原理 1) 在 Java 程序中,对于数据的输入/输出操作以“流”(stream) 方式进行:2) J2SDK 提供了各种各样的“流”类,用以获取不同种类的数据:程序中通过标准的方法输入或输出数据 ...

  7. Properties-转换流-打印流-序列化和反序列化-Commons-IO工具类

    一.Properties 类(java.util)     概述:Properties 是一个双列集合;Properties 属于map的特殊的孙子类;Properties 类没有泛型,propert ...

  8. [源码]ObjectIOStream 对象流 ByteArrayIOStream 数组流 内存流 ZipOutputStream 压缩流

    1.对象流 import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File ...

  9. IO流03_流的分类和概述

    [概述] Java的IO流是实现输入/输出的基础,它可以方便的实现数据的输入/输出操作. Java中把不同的输入/输出源(键盘.文件.网络连接)抽象表述为"流"(Stream). ...

  10. Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)

    1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中  数据源: a.txt -- 读取数据 ...

随机推荐

  1. Cenots更换YUM源的问题

    [1] 首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cent ...

  2. Java学习笔记23(Calendar类)

    Calendar意味日历,对Date类中的很多方法做了改进 Calendar类是一个抽象类,不可以见对象,需要子类完成实现 不过这个类有特殊之处,不需要创建子类对象,而是使用它的静态方法直接获取: 示 ...

  3. 【分享】2017 开源中国新增开源项目排行榜 TOP 100

    2017 年开源中国社区新增开源项目排行榜 TOP 100 新鲜出炉! 这份榜单根据 2017 年开源中国社区新收录的开源项目的关注度和活跃度整理而来,这份最受关注的 100 款开源项目榜单在一定程度 ...

  4. 【转】qlv文件如何转换成mp4 怎样把下载好的qlv格式视频转换成MP4格式

    狸窝  复制  收藏  保存到桌面  快速找教程方案  反馈需求  社会主义核心价值观  客服QQ41442901   马上注册 升级VIP   对于视频文件之间的转换问题,我也已经是无力吐槽了,每个 ...

  5. 3DES加密

    本文介绍了3DES加密特性,加密特点,3DES是对称加密,用一个密钥对内容进行加密,必须使用相同的密钥进行解密, 密钥必须配置,而且长度为24位,不足24位,用0位进行补全,本文也顺带介绍了其它加密算 ...

  6. golang 在 windows 下编译出 linux 二进制可执行文件的软件套装合集 [go 1.7.3环境]

    golang 很好用,不过要把工具链弄完整. 要不你会发现怎么不能编译跨平台的呀? 怎么写代码没提示啊? ... 这一整套弄下来并不容易. 所以精心准备了一套工具方便大家使用. 软件列表如图. 安装顺 ...

  7. canvas图像处理汇总

    一.canvas的情况 canvas自从出来了之后,在前端的图像处理上面提供了各种各样的遍历,虽然很多的操作其实都是要应用到算法的,但是这个也给前端提供了很多的可能性,其中最终要的一个canvas函数 ...

  8. Codeforces 903D Almost Difference

    Codeforces 903D Almost Difference time limit per test 2 seconds memory limit per test 256 megabytes ...

  9. 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】

    Big binary tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  10. BZOJ 2222: [Cqoi2006]猜数游戏【神奇的做法,傻逼题,猜结论】

    2222: [Cqoi2006]猜数游戏 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 604  Solved: 260[Submit][Status ...