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 ...
随机推荐
- deep_learning_Function_softmax_cross_entropy_with_logits
[TensorFlow]tf.nn.softmax_cross_entropy_with_logits的用法 [TensorFlow]tf.nn.softmax_cross_entropy_with_ ...
- 常见shell用法
分析nginx访问日志 awk '{a[b[$1]++]}END{for(i=length(a);i>0;i--)for(j in b)if(b[j]==i){c++;if(c<=10)p ...
- python中的else语句
python语言和其它语言一样在支持else语句,通常else语句和if语句合用,完成程序的分支选择功能. 例如如下打印学成成绩代码: score = int(input("请输入成绩:&q ...
- 使用C#表达式树为两个对象的相同属性赋值
//缓存表达式树 private static Dictionary<string, object> objCache = new Dictionary<string, object ...
- monkeyrunner脚本录制和回放下载
链接:https://pan.baidu.com/s/1Kye_E9u_WXeppFMlLhr_Cg 提取码:2coy
- tcpdump 为何抓包 抓到本机IP 都是内网IP
接收端 22:49:01.729351 IP 192.168.0.3.21918 > ***.**.**.**.44498 22:49:01.727980 IP ***.**.**.**.444 ...
- oracle表的列合并(group by)和行合并(union all)
group by select a.dn,t.dn dnt,a.BEGIN_TIME,a.R032_001,t.R032_001,a.R032_002,a.R032_003,a.R032_004, a ...
- 解决Javaweb中HTTP500的问题
当我们新建一个Web项目后,运行时可能出现HTTP-500的错误如下图所示 一般是由于路径配置出错 即你电脑上的Tomcat版本与代码本身版本不一致或没有配置路径造成的 解决方法如下 一.鼠标右击你 ...
- hiho #1038 : 01背包 (dp)
#1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...
- qt5-Qt Creator使用
设置编码: 工具-->选项-->文本编辑器-->行为-->编辑器 中文编译失败的解决: 编辑-->--> 在头文件中增加:--解决乱码问题(文本所在的头文件) #i ...