for (int pos = currentSize/2 + currentSize; pos < str.length(); pos++){
.....
这段逻辑没有执行 , pos < str.length() 为false
boolean tryAdvance(Consumer<? super T> action); 该方法会处理每个元素,如果没有元素处理,则应该返回false,否则
返回true
default void forEachRemaining(Consumer<? super T> action) 该方法有默认实现,功能后面会介绍。
Spliterator<T> trySplit(); 将一个Spliterator分割成多个Spliterator。分割的Spliterator被用于每个子线程进行处理,
从而达到并发处理的效果
long estimateSize(); 该方法返回值并不会对代码正确性产生影响,但是会影响代码的执行线程数,后续会
介绍一下
int characteristics(); 给出stream流具有的特性,不同的特性,不仅是会对流的计算有优化作用,更
可能对计算结果会产生影响,后续会稍作介绍。
default Comparator<? super T> getComparator() 对sorted的流,给出比较器。后续给出研究代码。
default void forEachRemaining(Consumer<? super T> action) {
do { } while (tryAdvance(action));
}
java.util.stream.AbstractTask<P_IN, P_OUT, R, K>的
public void compute() {
Spliterator<P_IN> rs = spliterator, ls; // right, left spliterators
long sizeEstimate = rs.estimateSize();
long sizeThreshold = getTargetSize(sizeEstimate);
boolean forkRight = false;
@SuppressWarnings("unchecked") K task = (K) this;
while (sizeEstimate > sizeThreshold && (ls = rs.trySplit()) != null) {
K leftChild, rightChild, taskToFork;
task.leftChild = leftChild = task.makeChild(ls);
task.rightChild = rightChild = task.makeChild(rs);
task.setPendingCount(1);
if (forkRight) {
forEachRemaining方法。
public class NumCounter {
private int num;
private int sum;
// 是否当前是个完整的数字
private boolean isWholeNum;
public NumCounter(int num, int sum, boolean isWholeNum) {
this.num = num;
this.sum = sum;
this.isWholeNum = isWholeNum;
}
public NumCounter accumulate(Character c){
System.out.println(Thread.currentThread().getName());
if (Character.isDigit(c)){
return isWholeNum ? new NumCounter(Integer.parseInt("" + c), sum, false) : new NumCounter(Integer.parseInt("" + num + c), sum, false);
}else {
return new NumCounter(0, sum + num, true);
}
}
public NumCounter combine(NumCounter numCounter){
return new NumCounter(0, this.getSum() + numCounter.getSum(), numCounter.isWholeNum);
}
public int getSum() {
return sum + num;
}
}
NumCounterSpliterator
public class NumCounterSpliterator implements Spliterator<Character> {
private String str;
private int currentChar = 0;
private boolean canSplit = true;
public NumCounterSpliterator(int currentChar,String str,boolean canSplit) {
this.str = str;
this.currentChar = currentChar;
this.canSplit = canSplit;
}
public void forEachRemaining(Consumer<? super Character> action) {
do {
} while (tryAdvance(action));
}
@Override
public boolean tryAdvance(Consumer<? super Character> action) {
if(str.equals("")){
return false;
}
action.accept(str.charAt(currentChar++));
return currentChar < str.length();
}
@Override
public Spliterator<Character> trySplit() {
int i = currentChar;
for(;canSplit && i < str.length(); ++i){
//第一个不是数字的pos,进行分割
if(!Character.isDigit(str.charAt(i))){
String str1 = str;
this.str = str1.substring(currentChar, i);
canSplit = false;
if(i + 1 < str1.length()){
return new NumCounterSpliterator(0,str1.substring(i+1, str1.length()),true);
}else{
return null;
}
}
}
canSplit = false;
return null;
}
@Override
public long estimateSize() {
return str.length() - currentChar;
}
@Override
public int characteristics() {
return ORDERED | SIZED | SUBSIZED | NONNULL | IMMUTABLE;
}
}
public class NumCounterTest {
public static void main(String[] args) {
String arr = "12%3 21sdas s34d dfsdz45 R3 jo34 sjkf8 3$1P 213ikflsd fdg55 kfd";
Stream<Character> stream = IntStream.range(0, arr.length()).mapToObj(arr::charAt);
System.out.println("ordered total: " + countNum(stream));
Spliterator<Character> spliterator = new NumCounterSpliterator(0,arr,true);
// 传入true表示是并行流
Stream<Character> parallelStream = StreamSupport.stream(spliterator, true);
System.out.println("parallel total: " + countNum(parallelStream));
}
private static int countNum(Stream<Character> stream){
NumCounter numCounter = stream.reduce(new NumCounter(0, 0, false), NumCounter::accumulate, NumCounter::combine);
return numCounter.getSum();
}
}
public class NumCounterSpliterator2 implements Spliterator<Character> {
private char[] str;
private int currentChar = 0;
private int end = Integer.MAX_VALUE;
private boolean canSplit = true;
public NumCounterSpliterator2(int currentChar,int end,char[] str,boolean canSplit) {
this.str = str;
this.currentChar = currentChar;
this.canSplit = canSplit;
this.end = end;
}
@Override
public boolean tryAdvance(Consumer<? super Character> action) {
action.accept( str[currentChar++] );
return currentChar < end;
}
@Override
public Spliterator<Character> trySplit() {
int i = currentChar;
for(;canSplit && i < end; ++i){
if(!Character.isDigit(str[i])){
int splitBeforeEnd = end;
end = i ;
canSplit = false;
if(i + 1 < splitBeforeEnd){
return new NumCounterSpliterator2(i+1,splitBeforeEnd,str,true);
}else{
return null;
}
}
}
canSplit = false;
return null;
}
@Override
public long estimateSize() {
return end - currentChar;
}
@Override
public int characteristics() {
return ORDERED | SIZED | SUBSIZED | NONNULL | IMMUTABLE;
}
}
public class NumCounterTest2 {
public static void main(String[] args) {
String arr = "12%3 21sdas s34d dfsdz45 R3 jo34 sjkf8 3$1P 213ikflsd fdg55 kfd";
Spliterator<Character> spliterator = new NumCounterSpliterator2(0,arr.length(),arr.toCharArray(),true);
// 传入true表示是并行流
Stream<Character> parallelStream = StreamSupport.stream(spliterator, true);
System.out.println("parallel total: " + countNum(parallelStream));
}
private static int countNum(Stream<Character> stream){
NumCounter numCounter = stream.reduce(new NumCounter(0, 0, false), NumCounter::accumulate, NumCounter::combine);
return numCounter.getSum();
}
}
转载自:http://blog.163.com/silver9886@126/blog/static/359718622017818916446/