gpt4 book ai didi

java - Java 8 中是否有一个类可以实现 "null-terminated"流而无需自己滚动?

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:08 26 4
gpt4 key购买 nike

或者是否有更好的方法来实现我所缺少的?我想创建一个基于供应商(通常是无限的)的流,但是当供应商返回 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λ 背后的公司工作)

Java 语言

Javaslang实现了他们自己的 Stream 类,该类受到 Scala 集合的启发,因此具有 takeWhile()

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

函数式 Java

Functional Java还附带了他们自己的 Stream 实现,它有一个 takeWhile() 方法:

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

关于java - Java 8 中是否有一个类可以实现 "null-terminated"流而无需自己滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34163347/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com