Exception in thread "main" java.lang.NullPointerException
at java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:52)
at java.util.Comparators$NaturalOrderComparator.compare(Comparators.java:1)
at java.util.TimSort.binarySort(TimSort.java:296)
at java.util.TimSort.sort(TimSort.java:239)
at java.util.Arrays.parallelSort(Arrays.java:1113)
at java.util.stream.SortedOps$OfRef.opEvaluateParallel(SortedOps.java:158)
at java.util.stream.AbstractPipeline.opEvaluateParallelLazy(AbstractPipeline.java:704)
at java.util.stream.AbstractPipeline.sourceSpliterator(AbstractPipeline.java:431)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at T2.main(T2.java:13)
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at java.util.stream.SortedOps$SizedRefSortingSink.accept(SortedOps.java:364)
at NumCounterSpliterator2.tryAdvance(NumCounterSpliterator2.java:24)
at java.util.Spliterator.forEachRemaining(Spliterator.java:326)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:1)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at NumCounterTest2.main(NumCounterTest2.java:32)
public void accept(P_OUT value) {
if (index >= fence) {
throw new IndexOutOfBoundsException(Integer.toString(index));
}
array[index++] = value;
}
@Override
public long estimateSize() {
return end - currentChar + 1;
}
public int characteristics() {
return ORDERED | SIZED | SUBSIZED | NONNULL | IMMUTABLE |DISTINCT;
}
String arr = "123123";
System.out.println(arr);
Spliterator<Character> spliterator = new NumCounterSpliterator2(0,arr.length(),arr.toCharArray(),true);
// 传入true表示是并行流
Stream<Character> parallelStream = StreamSupport.stream(spliterator, true);
parallelStream.distinct().forEach(System.out::print);
123123
123123
public Spliterator<Character> trySplit() {
int i = currentChar;
int currentCharOld = currentChar;
for(;canSplit && i <= end; ++i){
if(!Character.isDigit(str[i])){
int splitBeforeEnd = end;
canSplit = false;
if(i + 1 <= splitBeforeEnd){
currentChar = i + 1;
return new NumCounterSpliterator3(currentCharOld,i,str,true);// <<<<这样写的话其实就只开启了2个线程,一个主线程,一个子线程,感觉原作者可能写错了
}else{
return null;
}
}
}
canSplit = false;
return null;
}
@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;
}
if ((characteristics & Spliterator.SORTED) != 0 && spliterator.getComparator() != null) {
// Do not propagate the SORTED characteristic if it does not correspond
// to a natural sort order
return characteristics & SPLITERATOR_CHARACTERISTICS_MASK & ~Spliterator.SORTED;
}
else {
return characteristics & SPLITERATOR_CHARACTERISTICS_MASK;
}
java.util.stream.SortedOps.OfRef
OfRef(AbstractPipeline<?, T, ?> upstream) {
super(upstream, StreamShape.REFERENCE,
StreamOpFlag.IS_ORDERED | StreamOpFlag.IS_SORTED);
this.isNaturalSort = true;
// Will throw CCE when we try to sort if T is not Comparable
@SuppressWarnings("unchecked")
Comparator<? super T> comp = (Comparator<? super T>) Comparator.naturalOrder();
this.comparator = comp;
}
/**
* Sort using the provided comparator.
*
* @param comparator The comparator to be used to evaluate ordering.
*/
OfRef(AbstractPipeline<?, T, ?> upstream, Comparator<? super T> comparator) {
super(upstream, StreamShape.REFERENCE,
StreamOpFlag.IS_ORDERED | StreamOpFlag.NOT_SORTED);
this.isNaturalSort = false;
this.comparator = Objects.requireNonNull(comparator);
}
NumCounterSpliterator3
import java.util.Comparator;
import java.util.Spliterator;
import java.util.function.Consumer;
public class NumCounterSpliterator3 implements Spliterator<Character> {
private char[] str;
private int currentChar = 0;
private int end = Integer.MAX_VALUE;
private boolean canSplit = true;
public NumCounterSpliterator3(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;
int currentCharOld = currentChar;
for(;canSplit && i <= end; ++i){
if(!Character.isDigit(str[i])){
int splitBeforeEnd = end;
canSplit = false;
if(i + 1 <= splitBeforeEnd){
currentChar = i + 1;
return new NumCounterSpliterator3(currentCharOld,i,str,true);
}else{
return null;
}
}
}
canSplit = false;
return null;
}
@Override
public long estimateSize() {
return end - currentChar + 1 /*Long.MAX_VALUE*/ ;
}
public Comparator<? super Character> getComparator() {
return null;
}
@Override
public int characteristics() {
return ORDERED | SIZED | SUBSIZED | NONNULL | IMMUTABLE /*|SORTED*/;
}
}
NumCounterTest2
import java.util.Spliterator;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
public class NumCounterTest2 {
public static void main(String[] args) {
String arr = "12%3 21sdas s34d dfsdz45 R3 jo34 sjkf8 3$1P 213ikflsd fdg55 kfd";
System.out.println(arr);
Spliterator<Character> spliterator = new NumCounterSpliterator3(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/35971862201782111627311/