Saltar al contenido

Diferencia entre findAny() y findFirst() en Java 8

El paso a paso o código que verás en este artículo es la solución más sencilla y efectiva que encontramos a tus dudas o dilema.

Solución:

Lo que entendí es que ambos devolverán el primer elemento coincidente de la transmisión, por ejemplo, cuando se usan junto con el filtro.

Eso no es true. Según el javadoc, Stream#findAny():

Devuelve un Optional describiendo algunos elemento de la corriente, o un vacío
Optional si la corriente está vacía. El comportamiento de esta operación es explícitamente no determinista; es libre de seleccionar cualquier elemento en la transmisión. Esto es para permitir el máximo rendimiento en operaciones paralelas;

mientras Stream.findFirst() devolverá un Optional describiendo estrictamente el primer elemento de la corriente. Él Stream la clase no tiene .findOne() método, así que supongo que quisiste decir .findFirst().

No, ambos lo harán no devuelve el primer elemento del Stream.

Desde Stream.findAny() (énfasis mío):

Devuelve un Optional describiendo algún elemento del arroyo, o un vacío Optional si la corriente está vacía.

Esta es una operación de terminal de cortocircuito.

El comportamiento de esta operación es explícitamente no determinista; es libre de seleccionar cualquier elemento en la secuencia. Esto es para permitir el máximo rendimiento en operaciones paralelas; el costo es que varias invocaciones en la misma fuente pueden no devolver el mismo resultado. (Si se desea un resultado estable, utilice findFirst() en cambio.)

Entonces, para decirlo de manera más simple, puede o no elegir el primer elemento de Stream.

Con la implementación actual específica de Oracle, creo que devolverá el primer elemento en una canalización no paralela. Sin embargo, en una canalización paralela, no siempre se ejecutará, por ejemplo

System.out.println(IntStream.range(0, 100).parallel().findAny());

volvió OptionalInt[50] cuando lo ejecuté. De todos modos, debes no confía en eso.

findFirst devuelve los primeros elementos de la secuencia, pero findAny es libre de seleccionar cualquier elemento de la secuencia.

List lst1 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");
List lst2 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");

Optional findFirst = lst1.parallelStream().filter(s -> s.startsWith("D")).findFirst();
Optional fidnAny = lst2.parallelStream().filter(s -> s.startsWith("J")).findAny();

System.out.println(findFirst.get()); //Always print David
System.out.println(fidnAny.get()); //Print Jack/Jill/Julia :behavior of this operation is explicitly nondeterministic

Si haces scroll puedes encontrar las notas de otros creadores, tú todavía tienes la habilidad insertar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *