Java 如何自定义PriorityQueue.stream().foreach以按优先级顺序迭代
我有一个包含PriorityQueue字段的类:Java 如何自定义PriorityQueue.stream().foreach以按优先级顺序迭代,java,java-stream,priority-queue,Java,Java Stream,Priority Queue,我有一个包含PriorityQueue字段的类: public class MyClass<T>{ Queue<T> queue = new PriorityQueue<>(); 但这不会按优先级顺序公开队列元素。所以问题是:如何使foreach流方法的行为类似于: while(!queue.isEmpty()) queue.poll(); 您可以使用和方法获取并使用PriorityQueue中的元素创建流,并保持它们的顺
public class MyClass<T>{
Queue<T> queue = new PriorityQueue<>();
但这不会按优先级顺序公开队列元素。所以问题是:如何使foreach流方法的行为类似于:
while(!queue.isEmpty())
queue.poll();
您可以使用和方法获取并使用PriorityQueue
中的元素创建流
,并保持它们的顺序:
@Override
public Stream<T> stream() {
return Stream.generate(queue::poll);
}
或者,您可以简单地返回已排序的流:
@Override
public Stream<T> stream() {
return queue.stream()
.sorted(comparator);
}
当心Stream.generate
创建一个无序流,这完全违背了按优先级顺序迭代的目的。它碰巧按照顺序流所需的顺序处理元素,但这不是一种保证的行为。创建排序的流是一个安全的解决方案,它也不会清空队列,这是在集合上进行流处理时通常预期的行为。
@Override
public Stream<T> stream() {
return Stream.generate(queue::poll)
.limit(queue.size());
}
@Override
public Stream<T> stream() {
return queue.stream()
.sorted(comparator);
}
@Override
public Stream<T> stream() {
return Stream.generate(queue::poll)
.takeWhile(Objects::nonNull);
}