Funcionará bien la transmisión en paralelo con una operación distinta?

staba leyendo acerca de la apatridia y me encontré con esto enDo:

os resultados de la tubería de @Stream pueden ser no deterministas o incorrectos si los parámetros de comportamiento de las operaciones de transmisión son con estado. Una lambda con estado (u otro objeto que implementa la interfaz funcional adecuada) es aquel cuyo resultado depende de cualquier estado que pueda cambiar durante la ejecución de la canalización de flujo.

Ahora si tengo una lista de cadenas strList decir) y luego tratar de eliminar cadenas duplicadas utilizando secuencias paralelas de la siguiente manera:

List<String> resultOne = strList.parallelStream().distinct().collect(Collectors.toList());

o en caso de que queramos insensible a mayúsculas y minúsculas:

List<String> result2 = strList.parallelStream().map(String::toLowerCase)
                       .distinct().collect(Collectors.toList());

¿Puede este código tener algún problema ya que las secuencias paralelas dividirán la entrada y se distinguirán en un fragmento no significa necesariamente distintas en toda la entrada?

EDIT (resumen rápido de las respuestas a continuación)

Losdistinct es una operación con estado y, en el caso de operaciones intermedias con estado, los flujos paralelos pueden requerir múltiples pasadas o gastos generales de amortiguación sustanciales. Tambiéndistinct se puede implementar de manera más eficiente si el orden de los elementos no es relevante. También segúnDo:

Para las secuencias ordenadas, la selección de elementos distintos es estable (para elementos duplicados, el elemento que aparece primero en el orden de encuentro se conserva). Para las secuencias no ordenadas, no se hacen garantías de estabilidad.

Pero en el caso de una secuencia ordenada que se ejecuta en paralelo, puede ser inestable, lo que significa que mantendrá un elemento arbitrario en caso de duplicados y no necesariamente el primero como se esperaba dedistinct de lo contrario.

Desde elenlaza:

Internalmente, la operación distinta () mantiene un Conjunto que contiene elementos que se han visto anteriormente, pero está oculto dentro de la operación y no podemos acceder a él desde el código de la aplicación.

Entonces, en el caso de flujos paralelos, probablemente consumiría todo el flujo o podría usar CHM (algo así comoConcurrentHashMap.newKeySet()). Y para los ordenados probablemente usaríaLinkedHashSet o construcción similar.

Respuestas a la pregunta(4)

Su respuesta a la pregunta