我有一个类,里面有 PriorityQueue 字段:
public class MyClass<T>{
Queue<T> queue = new PriorityQueue<>();
我想以某种方式从 MyClass 获取流并使用 foreach 并希望序列按照我的 PriorityQueue 的优先级顺序运行。最简单的方法是重写stream()方法:
@Override
public Stream stream() {
return queue.stream();
}
但这不会按优先级顺序公开队列元素。所以问题是:如何使 foreach 流方法的行为如下:
while(!queue.isEmpty())
queue.poll();
你可以使用Stream::generate https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#generate-java.util.function.Supplier- and Queue::poll https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html#poll--方法来创建一个Stream
元素来自PriorityQueue
保持他们的秩序:
@Override
public Stream<T> stream() {
return Stream.generate(queue::poll);
}
然而这可能很危险,因为Stream::generate
将调用poll
不断地,所以它可能是一个无限的流。因此使用Stream::limit
应考虑队列大小:
@Override
public Stream<T> stream() {
return Stream.generate(queue::poll)
.limit(queue.size());
}
或者您可以简单地返回排序流:
@Override
public Stream<T> stream() {
return queue.stream()
.sorted(comparator);
}
其中 comparator 是你的比较器。
In Java 9你可以用Stream::takeWhile https://docs.oracle.com/javase/9/docs/api/java/util/stream/Stream.html#takeWhile-java.util.function.Predicate-带有拒绝空值的谓词。作为Queue::poll
将返回null
当队列为空时 - 结果Stream
将按顺序包含队列中的元素(这是使用的替代方法limit
如第一个解决方案中所述):
@Override
public Stream<T> stream() {
return Stream.generate(queue::poll)
.takeWhile(Objects::nonNull);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)