Dopo aver letto il codice sorgente, penso che dovrebbe essere il primo elemento più grande verrà trovato in base all'ordine di raccolta. Siamo in grado di controllare il codice sorgente del Stream.max(Comparator<? super T> comparator)
, la classe di implementazione è ReferencePipeline.max
@Override
public final Optional<P_OUT> max(Comparator<? super P_OUT> comparator) {
return reduce(BinaryOperator.maxBy(comparator));
}
che si può vedere, quando si chiama il Stream.max
, vuoi dire chiamare il Stream.reduce(BinaryOperator<P_OUT> accumulator)
E guardare il codice sorgente di BinaryOperator.maxBy(comparator)
public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {
Objects.requireNonNull(comparator);
return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;
}
E 'chiaro, quando a
uguale b
, restituisce a
. Quindi, quando ci sono più elementi "più grandi/più bassi" in un flusso, l'elemento "più grande/più basso" dovrebbe essere il primo elemento "più grande/più basso" in base all'ordine di raccolta
C'è un esempio a blew, solo per il tuo riferimento.
List<Student> list = Arrays.asList(new Student("s1", 1), new Student("s2", 5), new Student("s3", 3), new Student("s4", 5));
// it should be student of 's2'
list.stream().max(Comparator.comparing(Student::getScore));
// it should be student of 's4'
list.stream().reduce((a, b) -> Comparator.comparing(Student::getScore).compare(a, b) > 0 ? a : b);
Sembra non essere definito comportamento. –
Immagino che dipenda dalla collezione sottostante. – munyengm
Domanda laterale: perché è importante? – Tunaki