Como personalizar PriorityQueue.stream (). Foreach para iterar em ordem de prioridade

JJ feixe:

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();
Michalk:

Você pode usar Stream::generatee Queue::pollmétodo para obter criar uma Streamcom elementos de PriorityQueuecom a manutenção de sua ordem:

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

No entanto, este pode ser porque perigoso Stream::generateserá invocando pollconstantemente por isso é potencialmente um fluxo inifinite. Therfore usando Stream::limitcom 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::takeWhilecom o predicado que rejeita nulos. Como Queue::pollirá retornar nullquando fila está vazia - a resultante Streamconterá elementos da fila na sua ordem (isto é alternativa à utilização limitcomo descrita na primeira solução):

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

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=232890&siteId=1
Recomendado
Clasificación