Java 如何自定义PriorityQueue.stream().foreach以按优先级顺序迭代

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中的元素创建流,并保持它们的顺

我有一个包含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);
}