Tengo un problema con la secuencia de Java 8 para cada uno que intenta pasar al siguiente elemento del ciclo. No puedo configurar el comando como continue;
, solo return;
funciona, pero saldrá del ciclo en este caso. Necesito pasar al siguiente elemento del bucle. ¿Cómo puedo hacer eso?
Ejemplo (no funciona):
try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
filteredLines = lines.filter(...).foreach(line -> {
...
if(...)
continue; // this command doesn't working here
});
}
Ejemplo (en funcionamiento):
try(Stream<String> lines = Files.lines(path, StandardCharsets.ISO_8859_1)){
filteredLines = lines.filter(...).collect(Collectors.toList());
}
for(String filteredLine : filteredLines){
...
if(...)
continue; // it's working!
}
continue
que seguir moviéndose al siguiente elemento sin ningún cambio funcional de todos modos.else
bloque. Si no hay nada despuéscontinue
, suelte el bloque if y continúe: son inútiles.Respuestas:
El uso
return;
funcionará bien. No evitará que se complete el ciclo completo. Solo dejará de ejecutar la iteración actual delforEach
bucle.Prueba el siguiente programa pequeño:
Salida:
Observe cómo
return;
se ejecuta para lab
iteración, pero sec
imprime bien en la siguiente iteración.¿Por qué funciona esto?
La razón por la que el comportamiento parece poco intuitivo al principio es porque estamos acostumbrados a que la
return
declaración interrumpa la ejecución de todo el método. Entonces, en este caso, esperamos que lamain
ejecución del método en su conjunto se detenga.Sin embargo, lo que debe entenderse es que una expresión lambda, como:
... realmente necesita ser considerado como su propio "método" distinto, completamente separado del
main
método, a pesar de estar convenientemente ubicado dentro de él. Entonces, realmente, lareturn
declaración solo detiene la ejecución de la expresión lambda.La segunda cosa que debe entenderse es que:
... es realmente solo un bucle normal bajo las cubiertas que ejecuta la expresión lambda para cada iteración.
Con estos 2 puntos en mente, el código anterior se puede reescribir de la siguiente manera equivalente (solo con fines educativos):
Con este equivalente de código "menos mágico", el alcance de la
return
declaración se vuelve más evidente.fuente
Otra solución: pasar por un filtro con sus condiciones invertidas: Ejemplo:
puede ser reemplazado con
El enfoque más sencillo parece utilizar "retorno"; aunque.
fuente
La lambda a la que está pasando
forEach()
se evalúa para cada elemento recibido de la secuencia. La iteración en sí no es visible desde el alcance de la lambda, por lo que no puedecontinue
hacerlo como siforEach()
fuera una macro de preprocesador de C. En su lugar, puede omitir condicionalmente el resto de las declaraciones que contiene.fuente
Puede usar una
if
declaración simple en lugar de continuar. Entonces, en lugar de la forma en que tiene su código, puede intentar:El predicado en la declaración if será el opuesto del predicado en su
if(pred) continue;
declaración, así que use!
(no lógico).fuente