Nach dem Lesen des Quellcodes, denke ich, sollte das erste größte Element wird nach der Abholung Reihenfolge gefunden werden. Wir können den Quellcode der Stream.max(Comparator<? super T> comparator)
Check-out, ist die Implementierungsklasse ReferencePipeline.max
@Override
public final Optional<P_OUT> max(Comparator<? super P_OUT> comparator) {
return reduce(BinaryOperator.maxBy(comparator));
}
, die Sie sehen können, wenn Sie die Stream.max
nennen, rufen Sie meinen die Stream.reduce(BinaryOperator<P_OUT> accumulator)
Und Blick auf den Quellcode von 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;
}
es ist klar, wenn a
b
gleich, es gibt a
. Wenn also mehrere "größte/niedrigste" Elemente in einem Stream vorhanden sind, sollte das "größte/niedrigste" Element das erste "größte/niedrigste" Element gemäß der Sammlungsreihenfolge sein.
Es gibt ein Beispiel für blow, nur für deine Referenz
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);
Es scheint kein definiertes Verhalten zu sein. –
Ich könnte mir vorstellen, dass es von der zugrunde liegenden Sammlung abhängt. – munyengm
Side-Frage: Warum ist es wichtig? – Tunaki