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;
        }
    }
}

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

NullTerminatedStreamFactory.makeNullTerminatedStream(() -> {
            try {
                BlockingQueue<Message> queue = getBlockingQueue();
                return queue.poll(1,TimeUnit.SECONDS);
            } catch (Exception e) {
                log.error("Exception while trying to get message from queue",e);
            }
            return null;
        });

解决方法

您已经找到了完美有效的手工实现.

评论中所述,Java 9似乎添加一个takeWhile(Predicate)方法.在此之前,您可以使用实现类似takeWhile()的第三方库:

jOOλ

jOOλ有limitWhile(),它做同样的事情:

Seq.generate(supplier).limitWhile(Objects::nonNull);

(免责声明,我为jOOλ之后的公司工作)

Javaslang

Javaslang实现了自己的Stream类,它受到Scala集合的启发,因此带有Widget()

Stream.gen(supplier).takeWhile(Objects::nonNull);

功能Java

Functional Java还配有自己的Stream实现,那有一个takeWhile()方法

Stream.fromFunction(i -> supplier.get()).takeWhile(o -> o != null);

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...