stream并行自定义分割器spliterator

一、jdk1.8流实现并行是很简单的,只要在流上加parallel()方法。这个方法的并行原理是使用了fork/join递归的方式进,我们在开发中使用并行时,最关注的一个问题是共享变量。一种常用的方式是每次在使用时克隆这个变量,通过修改克隆变量而不影响原变量的方式,达到已占用更多的内存换取性能。当然这里不是我要讨论的,本次要讲的流并行时,如何分割数据或者说是任务。
1、我们做一个简单的字符串的单词个数计算,计算字符串有多少个单词,现有的流提供的操作方法中没有相应的处理,这里变通一下处理,把String变成Stream流,代码下如:
在这里插入图片描述
对字符处理的逻辑放在CounterWord类中,因为需要保存上一个字符是否为空。我们用流的reduce方法做归约统计。下面是CounterWord类的代码:
在这里插入图片描述
发现结果是7,正确,然后我们用并行来执行这段代码:
在这里插入图片描述
发现结果是11呢,原因并行时用fork/join方式,分割时把字符串里的有些单词给拆分成两个单词,所以单词数结果比正常的要多。我们要约束它的分割策略。
2、Spliterator接口就是给客户自定义分割器的,看它类的继承结构,你会发现有大量它的实现。它有以下几个抽象接口:
tryAdvance(Consumer<? super T> action),如果流中还有剩余的元素就消费它,同时返回true,否则返回false,表示流中已没有元素要处理。
trySplit(),处理分割策略的逻辑方法,返回一个Spliterator分割器。
estimateSize(),评估剩余还需要分割的大小,只是评估,不准确。
characteristics(),分割器的一些特性。
以下是分割的实现代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里要区分自定义的分割器跟计算单词个数的处理器。两个都是递归操作,前面是分割字符串,后面的是计数单词。换句话,就是前面的分割器会并行的分割成几个字符串数据源,后面的计数器也并行的对各个数据源进行递归计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值