Eu tenho uma classe com dentro de campo PriorityQueue:
public class MyClass<T>{
Queue<T> queue = new PriorityQueue<>();
Eu quero de alguma forma obter um fluxo de MyClass e uso foreach e quer se comportam seqüência em ordem de prioridade do meu PriorityQueue. A maneira mais fácil é fluxo de override () método:
@Override
public Stream stream() {
return queue.stream();
}
mas isso não vai expor o elemento fila em ordem de prioridade. Então a questão é: como fazer foreach método de fluxo se comportam como:
while(!queue.isEmpty())
queue.poll();
Você pode usar Stream::generate
e Queue::poll
método para obter criar uma Stream
com elementos de PriorityQueue
com a manutenção de sua ordem:
@Override
public Stream<T> stream() {
return Stream.generate(queue::poll);
}
No entanto, este pode ser porque perigoso Stream::generate
será invocando poll
constantemente por isso é potencialmente um fluxo inifinite. Therfore usando Stream::limit
com o tamanho da fila deve ser considerado:
@Override
public Stream<T> stream() {
return Stream.generate(queue::poll)
.limit(queue.size());
}
Ou você pode simplesmente retornar fluxo ordenado:
@Override
public Stream<T> stream() {
return queue.stream()
.sorted(comparator);
}
onde comparador é o seu comparador.
Em Java 9 você pode usar Stream::takeWhile
com o predicado que rejeita nulos. Como Queue::poll
irá retornar null
quando fila está vazia - a resultante Stream
conterá elementos da fila na sua ordem (isto é alternativa à utilização limit
como descrita na primeira solução):
@Override
public Stream<T> stream() {
return Stream.generate(queue::poll)
.takeWhile(Objects::nonNull);
}