一、Spliterator    

Spliterator<T> trySplit();
trySplit接口就相当于我们之前写的AccumulatorRecursiveTask类里面的分割任务,如果满足条件就继续往下分,返回一个新的spliterator出来。
Spliterator就相当于我们写的fork join逻辑,Stream就是使用Spliterator来实现fork join的功能,来实现多任务切分的。

代码例子:

 package com.cy.java8;

 import java.util.Objects;
import java.util.Optional;
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport; public class SpliteratorInAction {
private static String text =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in lacinia massa, quis eleifend dui. Sed in molestie ex.\n" +
"\n" +
"Integer dictum, erat ut interdum viverra, erat dui suscipit eros, eget vestibulum mi massa ut sem. Donec ultrices.\n" +
"\n" +
"Quisque lacinia non enim venenatis efficitur. Duis luctus at ex at ullamcorper. Fusce maximus sapien a scelerisque.\n" +
"\n" +
"Morbi eu congue ipsum, ac lobortis nulla. Proin cursus tortor lectus, nec luctus lectus ornare a. Mauris gravida nisl."; public static void main(String[] args) {
IntStream intStream = IntStream.rangeClosed(0, 10);
Spliterator.OfInt spliterator = intStream.spliterator();
spliterator.forEachRemaining((Consumer<Integer>) integer -> System.out.println(integer)); MySpliteratorText mySpliteratorText = new MySpliteratorText(text);
Optional.ofNullable(mySpliteratorText.stream().count())
.ifPresent(System.out::println);
mySpliteratorText.stream().filter(s -> !s.equals("")).forEach(System.out::println); Optional.ofNullable(mySpliteratorText.parallelStream().count())
.ifPresent(System.out::println);
mySpliteratorText.parallelStream().filter(s -> !s.equals("")).forEach(System.out::println);
} /**
* 自定义实现Spliterator接口
*/
public static class MySpliteratorText {
private final String[] data; public MySpliteratorText(String text) {
Objects.requireNonNull(text, "the parameter can not be null");
this.data = text.split("\n");
} public Stream<String> stream() {
return StreamSupport.stream(new MySpliterator(), false);
} public Stream<String> parallelStream() {
return StreamSupport.stream(new MySpliterator(), true);
} private class MySpliterator implements Spliterator<String> {
private int start, end; public MySpliterator() {
this.start = 0;
this.end = data.length - 1;
} public MySpliterator(int start, int end) {
this.start = start;
this.end = end;
} @Override
public boolean tryAdvance(Consumer<? super String> action) {
if (start <= end) {
action.accept(data[start++]);
return true;
}
return false;
} @Override
public Spliterator<String> trySplit() {
int mid = (end - start) / 2;
if (mid <= 1) {
return null;
} int left = start;
int right = start + mid;
start = start + mid + 1;
return new MySpliterator(left, right);
} @Override
public long estimateSize() {
return end - start;
} @Override
public long getExactSizeIfKnown() {
return estimateSize();
} @Override
public int characteristics() {
return IMMUTABLE | SIZED | SUBSIZED;
}
}
}
}

console打印:

0
1
2
3
4
5
6
7
8
9
10
7
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in lacinia massa, quis eleifend dui. Sed in molestie ex.
Integer dictum, erat ut interdum viverra, erat dui suscipit eros, eget vestibulum mi massa ut sem. Donec ultrices.
Quisque lacinia non enim venenatis efficitur. Duis luctus at ex at ullamcorper. Fusce maximus sapien a scelerisque.
Morbi eu congue ipsum, ac lobortis nulla. Proin cursus tortor lectus, nec luctus lectus ornare a. Mauris gravida nisl.
7
Quisque lacinia non enim venenatis efficitur. Duis luctus at ex at ullamcorper. Fusce maximus sapien a scelerisque.
Morbi eu congue ipsum, ac lobortis nulla. Proin cursus tortor lectus, nec luctus lectus ornare a. Mauris gravida nisl.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam in lacinia massa, quis eleifend dui. Sed in molestie ex.
Integer dictum, erat ut interdum viverra, erat dui suscipit eros, eget vestibulum mi massa ut sem. Donec ultrices.

  

---

Spliterator介绍的更多相关文章

  1. Java8系列 (三) Spliterator可分迭代器

    本文转载自 jdk8 Stream 解析2 - Spliterator分割迭代器. 概述 我们最为常见的流的产生方式是 collection.stream(), 你点开Stream()方法, 他是通过 ...

  2. Java 集合基础详细介绍

    一.Java集合框架概述 集合.数组都是对多个数据进行存储操作的结构,简称Java容器.此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt, .jpg, .avi,数据库中).Jav ...

  3. Collection接口介绍

    Collection接口介绍 一个Collection代表一组对象,是集合体系中的根接口.一些允许有重复的元素一些不允许,一些有顺序一些没有顺序.JDK不提供此接口具体类的直接实现,只会有子接口和抽象 ...

  4. java 8 stream中的Spliterator简介

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

  5. Spring官网阅读(十一)ApplicationContext详细介绍(上)

    文章目录 ApplicationContext 1.ApplicationContext的继承关系 2.ApplicationContext的功能 Spring中的国际化(MessageSource) ...

  6. 分割迭代器Spliterator源码文档翻译

    前言 身体是革命的本钱,不舒服了2周,现在好点了. 学习JDK8的Stream,Spliterator这个分割迭代器是必须要重视的. Notes:下方蓝色文字是自己的翻译(如果有问题请指正).黑色文字 ...

  7. CSS3 background-image背景图片相关介绍

    这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...

  8. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  9. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

随机推荐

  1. MySQL快速清空表数据

    truncate table 可以不删除表的情况下,快速情况表数据

  2. 12、rpm

    1.什么是rpm 由红帽开发用于软件包的安装 升级 卸载 查询 2.rpm包是什么样? 组成部分是什么样的? zip-3.0-11.el7.x86_64.rpm #el7 zip-3.0-1. el6 ...

  3. tp5之允许跨域请求

    一.在app顶层创建文件common\behavior\CronRun.php 写入以下代码 <?php namespace app\common\behavior; use think\Exc ...

  4. Summer training round2 #1

    A:水 B:求两个三角形之间的位置关系:相交 相离 内含 ①用三个点是否在三角形内外判断    计算MA*MB.MB*MC.MC*MA的大小 若这三个值同号,那么在三角形的内部,异号在外部 #incl ...

  5. office visio

    画 流程图软件 UML 是否要用做类图.时序图?????

  6. POJ1059Glass Beads

    Once upon a time there was a famous actress. As you may expect, she played mostly Antique Comedies m ...

  7. Python 3标准库 第十一章 网路通信

    网路通信11.1 ipaddress  : Internet 地址 ipaddress模块提供了处理IPv4和IPv6 11.1.2  网络 CMDB  11.2  socket:网络通信 11.2. ...

  8. entity framework delete table Error 11007:

    udate model from database 数据库表删除时,会出现“Error 11007:”的异常,此时在.edmx文件中找到此表的实体发现还存在,删除它就没有这个错误 了.

  9. 剑指Offer-快速排序

    剑指Offer上的快速排序的Partition函数与我在数据结构书上学到的不一样,因此就想要探索下这两种不同的处理方式. 1.基本思想 快速排序的基本思想是基于分治法.在待排序表L[1...n]中任取 ...

  10. 51 Nod 1627瞬间移动(插板法!)

    1627 瞬间移动  基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  关注 有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右 ...