Estoy tratando de cambiar algunos bucles for-each a forEach()
métodos lambda para descubrir las posibilidades de las expresiones lambda. Parece posible lo siguiente:
ArrayList<Player> playersOfTeam = new ArrayList<Player>();
for (Player player : players) {
if (player.getTeam().equals(teamName)) {
playersOfTeam.add(player);
}
}
Con lambda forEach()
players.forEach(player->{if (player.getTeam().equals(teamName)) {playersOfTeam.add(player);}});
Pero el siguiente no funciona:
for (Player player : players) {
if (player.getName().contains(name)) {
return player;
}
}
con lambda
players.forEach(player->{if (player.getName().contains(name)) {return player;}});
¿Hay algún error en la sintaxis de la última línea o es imposible regresar del forEach()
método?
return
dentro de una declaración lambda regresa de la propia lambda, no de lo que sea que se llame lambda. El uso de terminar una secuencia antes ("cortocircuito")findFirst
como se muestra en la respuesta de Ian Roberts .Respuestas:
El
return
no está regresando de la expresión lambda en lugar de a partir del método que contiene. En lugar deforEach
necesitarfilter
la transmisión:Aquí
filter
restringe la secuencia a aquellos elementos que coinciden con el predicado yfindFirst
luego devuelve unOptional
con la primera entrada coincidente.Esto parece menos eficiente que el enfoque de bucle for, pero de hecho
findFirst()
puede provocar un cortocircuito: no genera todo el flujo filtrado y luego extrae un elemento de él, sino que filtra solo tantos elementos como sea necesario para encuentra el primero que coincida. También puede usar enfindAny()
lugar defindFirst()
si no necesariamente le importa obtener el primer reproductor coincidente de la transmisión (ordenada), sino simplemente cualquier elemento coincidente. Esto permite una mejor eficiencia cuando hay paralelismo involucrado.fuente
orElse(null)
en unOptional
. El punto principal deOptional
es proporcionar una forma de indicar la presencia o ausencia de un valor en lugar de sobrecargar nulo (lo que conduce a NPE). Si lo usaoptional.orElse(null)
, recupera todos los problemas con nulos. Lo usaría solo si no puede modificar la persona que llama y realmente espera un nulo.Optional<Player>
sería una forma más natural de encajar en el paradigma de flujos. Solo estaba tratando de mostrar cómo duplicar el comportamiento existente usando lambdas.Le sugiero que primero intente comprender Java 8 en su totalidad, lo más importante en su caso serán los flujos, las lambdas y las referencias a métodos.
Usted debe no convertir el código existente para Java 8 código en una base de línea por línea, se debe extraer y convertir los rasgos.
Lo que identifiqué en su primer caso es lo siguiente:
Veamos cómo lo hacemos, podemos hacerlo con lo siguiente:
Lo que haces aquí es:
Collection<Player>
, ahora tiene un archivoStream<Player>
.Predicate<Player>
, mapeando cada jugador al booleano verdadero si desea que se mantenga.Collector
, aquí podemos usar uno de los recopiladores de bibliotecas estándar, que esCollectors.toList()
.Esto también incorpora otros dos puntos:
List<E>
overArrayList<E>
.new ArrayList<>()
, después de todo, está usando Java 8.Ahora en su segundo punto:
Una vez más, desea convertir algo de Java heredado a Java 8 sin mirar el panorama general. Esta parte ya ha sido respondida por @IanRoberts , aunque creo que debes hacer
players.stream().filter(...)...
lo que sugirió.fuente
Si desea devolver un valor booleano, puede usar algo como esto (mucho más rápido que el filtro):
fuente
Esto es lo que me ayudó:
Tomado de Java 8 Búsqueda de elementos específicos en una lista con Lambda
fuente
También puede lanzar una excepción:
Nota:
En aras de la legibilidad, cada paso del flujo debe aparecer en una nueva línea.
si su lógica está vagamente "impulsada por excepciones", por ejemplo, hay un lugar en su código que detecta todas las excepciones y decide qué hacer a continuación. Solo use el desarrollo impulsado por excepciones cuando pueda evitar ensuciar su base de código con múltiples
try-catch
y lanzar estas excepciones son para casos muy especiales que espera y se pueden manejar correctamente).fuente