gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:40:42 30 4
gpt4 key购买 nike

我有一个包含 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::generateQueue::poll使用 PriorityQueue 中的元素创建 Stream 并保持其顺序的方法:

@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 是你的比较器。

Java 9 中,您可以使用 Stream::takeWhile带有拒绝空值的谓词。由于 Queue::poll 将在队列为空时返回 null - 生成的 Stream 将按顺序包含队列中的元素(这是另一种选择按照第一个解决方案中的说明使用 limit):

@Override
public Stream<T> stream() {
return Stream.generate(queue::poll)
.takeWhile(Objects::nonNull);
}

关于java - 如何自定义 PriorityQueue.stream().foreach 以按优先顺序迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57349022/

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