Regreso de lambda forEach() en java




java foreach return string (3)

El return allí está regresando de la expresión lambda en lugar del método contenedor. En lugar de forEach , necesitas filter la transmisión:

players.stream().filter(player -> player.getName().contains(name))
       .findFirst().orElse(null);

Aquí, el filter restringe la secuencia a los elementos que coinciden con el predicado, y findFirst luego devuelve un Optional con la primera entrada coincidente.

Esto parece menos eficiente que el enfoque for-loop, pero de hecho findFirst() puede findFirst() un cortocircuito: no genera todo el flujo filtrado y luego extrae un elemento del mismo, en lugar de eso filtra solo tantos elementos como necesite para para encontrar la primera coincidencia. También puede usar findAny() lugar de findFirst() si no necesariamente se preocupa de obtener el primer jugador que hace juego de la transmisión (ordenada) sino simplemente cualquier elemento que coincida. Esto permite una mejor eficiencia cuando hay un paralelismo involucrado.

Estoy tratando de cambiar algunos for-each loops a lambda forEach() -methods para descubrir las posibilidades de las expresiones lambda. El siguiente parece ser posible:

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 algo mal en la sintaxis de la última línea o es imposible regresar del método forEach() ?



Si desea devolver un valor booleano, puede usar algo como esto (mucho más rápido que el filtro):

players.stream().anyMatch(player -> player.getName().contains(name));




return-type