JavaDoc di Spliterator
menziona che:C'è qualche pericolo nel rendere l'azione. Accept() più di un elemento in un'implementazione di .tryAdance() di Spliterator?
Uno Spliterator può attraversare elementi singolarmente (tryAdvance()) o sequenzialmente in massa (forEachRemaining()).
Poi andiamo al javadoc of tryAdvance()
che dice che:
Se un elemento residuo esiste, esegue l'azione data su di esso, restituendo vero; altrimenti restituisce false.
Forse sono travisamento da qualche parte, ma a me sembra che a condizione che vi sia un elemento, o più, rimanendo, il Consumer
come argomento dovrebbe solo ogni .accept()
un argomento prima di tornare true
, e che se, per esempio, ho due argomenti immediatamente disponibile, allora non posso:
action.accept(arg1);
action.accept(arg2);
return true;
In this project, ho riscritto l'ampiezza prima spliterator in modo che ora recita:
// deque is a Deque<Iterator<T>>
@Override
public boolean tryAdvance(final Consumer<? super T> action)
{
Iterator<T> iterator;
T element;
while (!deque.isEmpty()) {
iterator = deque.removeFirst();
while (iterator.hasNext()) {
element = iterator.next();
deque.add(fn.apply(element));
action.accept(element);
}
}
return false;
}
In breve, faccio in modo che lo action
accetti tutti gli argomenti e restituisca falso ... e il test, anche se piuttosto semplice, ha ancora esito positivo (link).
Nota che .trySplit()
restituisce sempre null
; e lo spliterator ha le caratteristiche DISTINCT
, ORDERED
e NONNULL
.
Quindi, c'è un flusso di utilizzo in cui il codice sopra non funzionerà a causa del metodo sopra consumando tutti gli elementi contemporaneamente?
è veramente importante se l'attuale implementazione di un particolare pause API, quando si viola il contratto generale un 'interfaccia'? Non stai solo invocando l'azione più di una volta, stai anche restituendo 'false' nonostante ci fossero degli elementi. – Holger
@Holger il problema è che non è chiaro per me cosa dovrebbe accadere se rimane più di un elemento – fge
Mirare a come interpretare il contratto o cosa dovresti fare, praticamente? – Holger