小编Pau*_*len的帖子

java 8中是否有一个实现"以null结尾"的流而不必自己滚动的类?

或者,有没有更好的方法来做到这一点,我错过了?我想基于供应商创建一个流(通常是无限的),但是当供应商返回null时,流终止.我自己做了这个,但是完成一个非常简单的概念似乎是相当多的工作.

public class NullTerminatedStreamFactory {

    static int characteristics = Spliterator.ORDERED | Spliterator.DISTINCT;

    public static<T> Stream<T> makeNullTerminatedStream(Supplier<T> supplier) {
        return StreamSupport.stream(new NullTerminatedSpliteratorFromSupplier<>(supplier, Long.MAX_VALUE, characteristics), false);
    }

    static class NullTerminatedSpliteratorFromSupplier<T> extends Spliterators.AbstractSpliterator<T> {

        public NullTerminatedSpliteratorFromSupplier(Supplier<T> supplier, long est, int additionalCharacteristics) {
            super(est, additionalCharacteristics);
            this.supplier = supplier;
        }

        public Supplier<T> supplier;

        @Override
        public boolean tryAdvance(Consumer<? super T> action) {
            T next = supplier.get();
            if (next != null) {
                action.accept(next);
                return true;
            }
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为了记录,我正在使用它,基本上从BlockingQueue创建一个Stream:

NullTerminatedStreamFactory.makeNullTerminatedStream(() -> {
            try { …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

12
推荐指数
1
解决办法
1028
查看次数

标签 统计

java ×1

java-8 ×1

java-stream ×1