Estoy tratando de entender por qué el resultado de este ejemplo es siempre cierto que aquí está mi ejemplo:
String s1 = Arrays.asList("A", "E", "I", "O", "U").stream()
.reduce("", String::concat);
String s2 = Arrays.asList("A", "E", "I", "O", "U").parallelStream()
.reduce("", String::concat);
System.out.println(s1.equals(s2));
Esto siempre se imprime true
, lo que sé es con el parallelStream no podemos predecir los resultados puede alguien explicar por qué?
Si se echa un vistazo a los documentos de Stream.reduce()
que se encuentra esta:
Realiza una reducción en los elementos de esta corriente [...] y devuelve el valor reducida. Esto es equivalente a:
T result = identity; for (T element : this stream) result = accumulator.apply(result, element) return result;
pero no está limitado a ejecutar secuencialmente.
Así Stream.reduce()
se asegura que los valores se procesan en orden.
Si intenta usar Stream.forEach()
e imprimir cada valor de la siguiente manera:
Arrays.asList("A", "E", "I", "O", "U").stream()
.forEach(System.out::print);
System.out.println();
Arrays.asList("A", "E", "I", "O", "U").parallelStream()
.forEach(System.out::print);
Obtendrá este resultado (o algo similar en la segunda línea):
AEIOU
IUOEA
( Stream.forEachOrdered()
Con el ejemplo anterior también se imprimirá los valores en orden)