Spliterator介绍
一、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介绍的更多相关文章
- Java8系列 (三) Spliterator可分迭代器
本文转载自 jdk8 Stream 解析2 - Spliterator分割迭代器. 概述 我们最为常见的流的产生方式是 collection.stream(), 你点开Stream()方法, 他是通过 ...
- Java 集合基础详细介绍
一.Java集合框架概述 集合.数组都是对多个数据进行存储操作的结构,简称Java容器.此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt, .jpg, .avi,数据库中).Jav ...
- Collection接口介绍
Collection接口介绍 一个Collection代表一组对象,是集合体系中的根接口.一些允许有重复的元素一些不允许,一些有顺序一些没有顺序.JDK不提供此接口具体类的直接实现,只会有子接口和抽象 ...
- java 8 stream中的Spliterator简介
目录 简介 tryAdvance trySplit estimateSize characteristics 举个例子 总结 java 8 stream中的Spliterator简介 简介 Split ...
- Spring官网阅读(十一)ApplicationContext详细介绍(上)
文章目录 ApplicationContext 1.ApplicationContext的继承关系 2.ApplicationContext的功能 Spring中的国际化(MessageSource) ...
- 分割迭代器Spliterator源码文档翻译
前言 身体是革命的本钱,不舒服了2周,现在好点了. 学习JDK8的Stream,Spliterator这个分割迭代器是必须要重视的. Notes:下方蓝色文字是自己的翻译(如果有问题请指正).黑色文字 ...
- CSS3 background-image背景图片相关介绍
这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...
- MySQL高级知识- MySQL的架构介绍
[TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...
- Windows Server 2012 NIC Teaming介绍及注意事项
Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...
随机推荐
- python、第二篇:库相关操作
一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...
- verilog分频模块设计
verilog设计: 分频器的设计: 分频器就是将一个时钟源的频率降低的过程(可以通过观察分频之后周期中包含几个原时钟周期来看是几分频),分频分为基数分频也分为偶数分频, 偶数分频的代码如下:(其中就 ...
- 关于tp5.0中对象数组转换普通数组使用助手函数collection而不是toArray
tp5.0新版的模型查询返回默认对象,系统默认增加了toArray方法,许多开发者在all或select尝试使用toArray来转换为数组,在此希望开发者能理解对象的概念,尝试使用对象进行数据的使用, ...
- PHP 随机字符
随机字符生成 function randStr($length=4,$type="1"){ $array = array( '1' => '0123456789', '2' ...
- phpMyAdmin无法缓存模板文件,所以会运行缓慢。
出现这个的原因是 phpmyadmin的安装目录, tmp目录不存在,或者存在但是权限不对.这是个缓存目录,可以加快phpmyadmin的运行,即使不理睬这个警告信息,也不会影响程序的执行. 解决的方 ...
- 【BZOJ3143】【Luogu P3232】 [HNOI2013]游走 概率期望,图论
期望\(DP\)入门题目. 关键思想:无向边的转移作为有向边考虑.其他的就是直接上全期望公式.由于这个题目不是有向无环图,所以需要高斯消元搞一搞. 设每个点的期望经过次数是\(g(x)\),那么有 \ ...
- 使用GitHub(三):使用VSCode+GitHub进行版本控制
使用GitHub(三):使用VSCode+GitHub进行版本控制 本文简单介绍使用VSCode+GitHub进行项目或者代码的版本控制.本文主要目的是对学习内容进行总结以及方便日后查阅. 详细教程和 ...
- 初识linux(简单命令)
之前一直搞不懂,为什么全是命令行的linux系统这么多公司都在用,当你看不懂那一行行命令时你一定会和我一样觉得头大.但当你学习了命令再结合桌面版觉得linux还是挺不错的
- 后端返回图片的url,将其转成base64,再次进行上传
//将图片变成base64再上传(主要是转化来自客户端的图片) getUrlBase64=(url, ext)=> { var canvas = document.createEl ...
- CSS之运算,Sass 之运算(加、减、乘、除)
1. 加减法 加减法不是重点,重点是在SassScript中用到的两种单位之间的转换:绝对单位:px, pt, pc, in, mm, cm...绝对单位都能运算:相对单位:ex, em, rem.. ...