从数组中创建一个高效的Java 8排序的Spliterator

在Java 8中,提供各种convenient utilities以从阵列构建高效的Spliterator.但是,没有提供工厂方法来构建具有比较器的Spliterator.明确的分配器允许有附加的比较器;他们有getComparator()方法和SORTED属性.

图书馆作者应该如何构建SORTED拼写器?

似乎没有预见到这样一个Spliterator有一个非自然的命令.但实现它并不是那么难.它可能看起来像这样:

class MyArraySpliterator implements Spliterator.OfInt {
    final int[] intArray;
    int pos;
    final int end;
    final Comparator<? super Integer> comp;

    MyArraySpliterator(int[] array, Comparator<? super Integer> c) {
        this(array, 0, array.length, c);
    }
    MyArraySpliterator(int[] array, int s, int e, Comparator<? super Integer> c) {
        intArray=array;
        pos=s;
        end=e;
        comp=c;
    }
    @Override
    public OfInt trySplit() {
        if(end-pos<64) return null;
        int mid=(pos+end)>>>1;
        return new MyArraySpliterator(intArray, pos, pos=mid, comp);
    }
    @Override
    public boolean tryAdvance(IntConsumer action) {
        Objects.requireNonNull(action);
        if(pos<end) {
            action.accept(intArray[pos++]);
            return true;
        }
        return false;
    }
    @Override
    public boolean tryAdvance(Consumer<? super Integer> action) {
        Objects.requireNonNull(action);
        if(pos<end) {
            action.accept(intArray[pos++]);
            return true;
        }
        return false;
    }
    @Override
    public long estimateSize() {
        return end-pos;
    }
    @Override
    public int characteristics() {
        return SIZED|SUBSIZED|SORTED|ORDERED|NONNULL;
    }
    @Override
    public Comparator<? super Integer> getComparator() {
        return comp;
    }
}

但Java 8尚未完全修复.也许在决赛中会有一个JRE提供的解决方案.

http://stackoverflow.com/questions/20075860/making-an-efficient-java-8-sorted-spliterator-from-an-array

转载注明原文:从数组中创建一个高效的Java 8排序的Spliterator