La llamada subyacente de reduce es reduceLeft, y los elementos del conjunto se agregan en pares de izquierda a derecha.
En el ejemplo anterior, el proceso en ejecución de list1.reduce (_ + _) es: => (((((1 + 2) + 3) + 4) + 5) + 6
reduceRight
Primero, echemos un vistazo al código fuente de reduceRight:
Ejecute list1.reduceRight (_-_). Primero, nuestra colección no es una colección vacía, y luego juzgamos si el elemento final de nuestra colección está vacío. La primera ejecución es obviamente no vacía, por lo que la primera ejecución es op ( head, tail .reduceRight (op)) , que es 1-op (List (2,3,4,5,6))
En la segunda ejecución, se hace el mismo juicio que el anterior, es decir, 1- (2- (Lista (3,4,5,6))).
La tercera ejecución, la misma, 1- (2- (3- (Lista (4, 5, 6)))).
...
Hasta la quinta ejecución, 1- (2- (3- (4- (5-op (List (6)))))).
Por sexta vez, tail.isEmpty es verdadero, luego se devuelve la cabeza, es decir, 1- (2- (3- (4- (5-6))))) = -3.