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

流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. Spring_Spring与AOP

    一.传统编程使用代理解决目标类增强问题 //主业务接口 public interface ISomeService { // 目标方法 void doFirst(); // 目标方法 void doS ...

  2. 深入理解JVM(三)——配置参数

    JVM配置参数分为三类参数: 1.跟踪参数 2.堆分配参数 3.栈分配参数 这三类参数分别用于跟踪监控JVM状态,分配堆内存以及分配栈内存. 跟踪参数 跟踪参数用于跟踪监控JVM,往往被开发人员用于J ...

  3. JAVA中的 static使用

    主要内容: 1.静态变量 2.静态方法 3.静态代码块 静态变量 我们知道,可以基于一个类创建多个该类的对象,每个对象都拥有自己的成员,互相独立.然而在某些时候,我们更希望该类所有的对象共享同一个成员 ...

  4. java_web学习(三) eclipse_jsp学习

    1.首先打开eclipse,新建一个Dynamac web project项目文件 2.在WebContent单击右键创建JSP File 3.过程 4.简单的jsp代码 运行结果: 5.导出war文 ...

  5. linux(六)之文本操作

    接下来我们一起来看一下再linux中怎么去对文本进行操作的 一.文本文件 既然要操作文本,所以我们要对文本有一个了解,那什么是文本文件呢. 文本文件是一种由若干行字符构成的计算机文件.文本文件存在于计 ...

  6. bzoj 2946

    Description          给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l        读入单词 l        计算最长公共子串的长度 l        输 ...

  7. VS2012 TFS解决离职后代码遗留未迁入问题

    第一步: 在命令行中输入 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE 第二步: 根据用户查找该用户下workspac ...

  8. 一步步教你创建自己的数字货币(代币)进行ICO

    本文从技术角度详细介绍如何基于以太坊ERC20创建代币的流程. 写在前面 本文所讲的代币是使用以太坊智能合约创建,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 ...

  9. [Golang]一道考察defer与命名返回值的题目

    题目 输出: 4 1 3 解释 当函数有可命名结果形参时,结果形参的初始值被设置为零值,函数的return语句会设置结果形参的值 当函数有可命名结果形参时,defer函数是可以修改它,然后再将它的值返 ...

  10. [国嵌笔记][019][Eclipse集成开发环境]

    Eclipse集成开发环境的作用 可以编译程序,也可以对程序进行在线调试 集成开发环境 1.JLink连接开发板的JTAG 2.JLink连接PC的USB 3.eclipse软件 4.gdb serv ...