Cargando...

Streams en Java

Inicias una tubería desde una lista con stream(), conservas o cambias elementos y luego imprimes. En Pipe.java mantienes la clase pública Pipe, importas java.util.ArrayList, guardas "oak" y "pine" y llamas names.stream().filter(n -> n.startsWith("o")).forEach(n -> System.out.println(n));. Compila con javac Pipe.java y ejecuta java Pipe. La pantalla debería mostrar oak. Una segunda demo usa map para que la pantalla muestre OAK, luego PINE. Deja Records opcional para la página siguiente. Esta lección es una tubería stream, no un forEach llano sobre la lista ni una demo de Generics con get(0).

Filtrar una palabra que coincide

Abre Pipe.java. Mantén el nombre de clase pública Pipe. Borra demos sobrantes solo-lambda de Cue, impresiones sobrantes de Bin generics, ejecuciones sobrantes de argumentos del programa Flag y avisos Scanner de Box si entierran la historia de streams. El programa no debe esperar tecleo ni exigir palabras al lanzar.
Añade el import arriba:
import java.util.ArrayList;
Dentro de Pipe.main construyes una lista tipada con dos palabras y arrancas un stream que conserva palabras que empiezan por o:
ArrayList<String> names = new ArrayList<>();
names.add("oak");
names.add("pine");
names.stream().filter(n -> n.startsWith("o")).forEach(n -> System.out.println(n));
stream() abre la tubería. filter conserva elementos cuyo lambda devuelve true. forEach imprime cada elemento conservado. "oak" empieza por o. "pine" no. La pantalla muestra oak.

Pipe stream filter prints oak

java
import java.util.ArrayList;

public class Pipe {
    public static void main(String[] args) {
        ArrayList<String> names = new ArrayList<>();
        names.add("oak");
        names.add("pine");
        names.stream().filter(n -> n.startsWith("o")).forEach(n -> System.out.println(n));
    }
}

Desde la carpeta que contiene Pipe.java, ejecuta javac Pipe.java. Cuando llaves y punto y coma coinciden, javac no escribe línea propia. Luego ejecuta java Pipe — no java Pipe.java. Mantén una clase pública para que el nombre coincida con Pipe.
Recorre la ejecución una vez. Java empieza en Pipe.main. La lista guarda "oak" y "pine". stream() comienza. filter conserva "oak". forEach imprime oak. No imprime ambas palabras. Nada llama solo names.forEach sin stream(). Nada lee args[0].
Repite la regla de principiante mientras miras la pantalla: stream() inicia la tubería; filter elige; forEach termina con impresión como efecto lateral. No inventes demos de Records en esta página. Records espera la lección opcional siguiente. No quites stream() y esperes que filter cuelgue de la lista en esta forma didáctica.
Si aún ves oak luego pine por un archivo sobrante de Cue con forEach, cambia a Pipe y conserva el paso filter. Si javac rechaza stream, confirma que el tipo de lista es ArrayList y la llamada es names.stream().

Map: cada palabra en mayúsculas

Mantén la misma clase pública Pipe. Cambia la tubería para transformar cada palabra en lugar de filtrar:
names.stream().map(n -> n.toUpperCase()).forEach(n -> System.out.println(n));
Conserva "oak" y "pine" en la lista. Compila otra vez con javac Pipe.java y ejecuta java Pipe. La pantalla muestra OAK, luego PINE. map devuelve un valor nuevo por elemento. forEach imprime esos valores en orden.

Pipe stream map prints OAK then PINE

java
import java.util.ArrayList;

public class Pipe {
    public static void main(String[] args) {
        ArrayList<String> names = new ArrayList<>();
        names.add("oak");
        names.add("pine");
        names.stream().map(n -> n.toUpperCase()).forEach(n -> System.out.println(n));
    }
}

Recorre la ejecución una vez. El primer valor mapeado es OAK. El segundo es PINE. Mantén las dos demos como dos formas didácticas. Primero demuestras que filter conserva una palabra. Luego demuestras que map cambia cada palabra. Ambas comparten import, lista tipada, stream() y un forEach terminal.
Si encadenas filter y map en tus propios experimentos más adelante, el orden importa. Esta página deja un paso intermedio por demo para que la pantalla siga legible.

Hábitos de tubería

Mantén los pasos en orden mientras practicas.

📊 Hábitos de Stream para Pipe

Step Call Beginner check
Start names.stream() opens the pipeline from the list
Keep some filter(n -> ...) lambda returns true to keep
Change each map(n -> ...) lambda returns the new value
Finish print forEach(n -> System.out.println(n)) terminal step that prints
Skip stream() list has no filter in this shape put stream() before filter or map

Streams no es solo Lambda ni Records

Lambda enseñó forEach directamente sobre la lista. Streams pone stream() primero para poder filter o map antes del forEach final. Records introducirá un tipo de datos compacto en una página opcional posterior. No mezcles esas tres tareas en un solo archivo de principiante hoy.
oak conservada por filter sigue siendo un elemento de lista en la tubería. No es args[0] de Flag. Cuando un archivo sobrante de Cue imprime cada elemento sin filter, déjalo como historia y conserva la línea stream().filter de Pipe.
Sin stream(), las llamadas filter y map de esta página no son la forma didáctica. Sin un forEach terminal, la tubería no imprime. Mantén ambos extremos de la tubería juntos al practicar cada demo. Mantén la sintaxis de Records fuera de esta página hasta esa lección, aunque hayas visto un titular sobre tipos compactos en la ruta opcional.

Comprobaciones de carpeta antes de Records

Lista la carpeta tras compilar bien. Deberías ver Pipe.java y Pipe.class juntos. Edita el código fuente, guarda, ejecuta javac Pipe.java, luego java Pipe. Un .class viejo puede mostrar la pantalla filter antigua si omites compilar tras pasar a map.
Si javac se queja de clases públicas duplicadas, deja solo Pipe pública. Si la pantalla muestra oak y pine en la demo filter, puede faltar startsWith("o") — restaura el lambda de filter. Si no imprime nada, confirma que add corrió antes de stream().
No pegues el forEach de lista de Cue como sustituto de toda la tubería en esta página. No pegues get(0) de Bin en Pipe. El trabajo opcional de streams es stream más un paso intermedio más forEach.

Antes de Records opcional

Puedes mantener la clase pública Pipe, importar ArrayList, añadir "oak" y "pine", llamar names.stream().filter(n -> n.startsWith("o")).forEach(...), ver oak, luego llamar names.stream().map(n -> n.toUpperCase()).forEach(...), ver OAK luego PINE. Compila con javac Pipe.java y ejecuta java Pipe. La tabla separa inicio, filter, map y fin. La siguiente página opcional es Records.
Conserva las demos de Pipe como par claro de streams. Mantén archivos lambda de Cue fuera de esta página al practicar tuberías. Mantén archivos Generics de Bin fuera de esta página al practicar tuberías. Mantén trabajo de Records fuera de esta página hasta esa lección. Esos hábitos son el control antes de seguir. Cuando la pantalla filter muestra oak o la pantalla map muestra OAK luego PINE, Streams cumplió su trabajo en esta lección y estás listo para Records si continúas la ruta opcional.
Un último repaso de carpeta: una Pipe pública, import presente, ArrayList<String> tipada, stream() antes de filter o map, forEach terminal, sin espera Scanner, sin palabras de lanzamiento obligatorias. Ejecuta javac Pipe.java y java Pipe una vez más en la demo que tengas abierta. Si la pantalla sigue mostrando oak o OAK luego PINE, la forma de Streams es sólida y el curso puede pasar a Records opcional en la página siguiente. Prefiere un hábito de tubería claro en cada lectura para que cada paso enseñe el mismo mapa.

🧠 Pon a Prueba tu Conocimiento

Listo para Empezar

Pon a Prueba tu Conocimiento

Ponte a prueba con este cuestionario interactivo y descubre qué tan bien entiendes el tema

❓
5
Preguntas
🎯
70%
Para Aprobar
♾️
∞
Tiempo
🔄
∞
Intentos

📝 Instrucciones

  • Lee cada pregunta cuidadosamente
  • Selecciona la mejor respuesta para cada pregunta
  • Puedes repetir el quiz tantas veces como quieras
  • Tu progreso se mostrará en la parte superior