Acabo de comenzar a jugar con Java 8 lambdas y estoy tratando de implementar algunas de las cosas a las que estoy acostumbrado en lenguajes funcionales.
Por ejemplo, la mayoría de los lenguajes funcionales tienen algún tipo de función de búsqueda que opera en secuencias o listas que devuelve el primer elemento, para el cual está el predicado true
. La única forma en que puedo ver para lograr esto en Java 8 es:
lst.stream()
.filter(x -> x > 5)
.findFirst()
Sin embargo, esto me parece ineficiente, ya que el filtro escaneará toda la lista, al menos a mi entender (lo que podría estar mal). ¿Hay una mejor manera?
java
java-8
java-stream
siki
fuente
fuente
Respuestas:
No, el filtro no escanea todo el flujo. Es una operación intermedia, que devuelve una secuencia diferida (en realidad, todas las operaciones intermedias devuelven una secuencia diferida). Para convencerte, simplemente puedes hacer la siguiente prueba:
Qué salidas:
Verá que solo los dos primeros elementos de la secuencia se procesan realmente.
Entonces puedes seguir con tu enfoque, que está perfectamente bien.
fuente
get();
aquí porque sé qué valores le doy a la tubería de transmisión y, por lo tanto, habrá un resultado. En la práctica, no debe usarget();
, peroorElse()
/orElseGet()
/orElseThrow()
(para un error más significativo en lugar de un NSEE), ya que es posible que no sepa si las operaciones aplicadas a la tubería de flujo darán como resultado un elemento..findFirst().orElse(null);
por ejemploorElse
?Optional
tipo, que es lo que.findFirst
regresa. Uno de los usos de Opcional es ayudar a los desarrolladores a evitar tener que lidiar connull
seg en lugar de verificarmyObject != null
, puede verificarmyOptional.isPresent()
o usar otras partes de la interfaz Opcional. ¿Eso lo hizo más claro?No, no se "romperá" tan pronto como se encuentre el primer elemento que satisfaga el predicado. Puede leer más sobre la pereza en el paquete de transmisión javadoc , en particular (énfasis mío):
fuente
Tuve que filtrar solo un objeto de una lista de objetos. Así que usé esto, espero que ayude.
fuente
.orElse(null) != null
. En su lugar, utilice las API opcionales,.isPresent
es decir.findFirst().isPresent()
..stream().map(ParkingLot::getId).anyMatch(Predicate.isEqual(id))
Además de la respuesta de Alexis C , si está trabajando con una lista de matriz, en la que no está seguro de si el elemento que está buscando existe, utilícelo.
Entonces puedes simplemente verificar si un es
null
.fuente
fuente
Respuesta mejorada de One-Liner: si está buscando un valor de retorno booleano, podemos hacerlo mejor agregando isPresent:
fuente