JavaRush /Blog Java /Random-ES /Flujos simples no simples
Oleg Savenko
Nivel 41
Одесса

Flujos simples no simples

Publicado en el grupo Random-ES
Con cada nueva versión de Java se vuelve cada vez más rico. Si bien gran parte de la riqueza reside en versiones anteriores, el lenguaje ha seguido mejorando tanto en metodología como en implementación. Las colecciones en Java no son una excepción. El marco de las colecciones principales apareció en J2SE 1.2 y continuó evolucionando, sufriendo cambios que fueron más agradables que decepcionantes. Con el lanzamiento de JDK 5, las colecciones se han vuelto más convenientes, más rápidas y más fáciles de trabajar. Esto llevó al hecho de que los programadores comenzaron a explotarlos más intensamente. Se han desarrollado ciertos patrones para trabajar con ellos, que sin duda son efectivos. Pero con JDK 8, las colecciones volvieron a mejorar y mejoraron gracias a los subprocesos. Evidentemente, debido a que la colección se puede representar en forma de flujos, la metodología para trabajar con ellos también cambiará. Por lo tanto, quiero mostrar cómo las soluciones familiares y comprensibles con colecciones se vuelven aún más simples.

Ejemplo 1. No podría ser más sencillo

Por supuesto, comencemos con lo más simple, repasemos todos los elementos de la colección y visualicemos todos los elementos.
// создадим и заполним список
   List<Integer> list = new ArrayList<>();
   Collections.addAll(list, 1, 5, 6, 11, 3, 15, 7, 8);
   // а теперь
   // быстрый for по всем elementoм, только для коллекций
   for (Integer i:list){
       System.out.println(i);
   }
   //но мы уже живем в JDK 8
   //а значит нужно так
   list.stream().forEach(System.out::println);
Como habrás notado, hay una nueva sintaxis que, en mi opinión como novato en Java, es mucho más sencilla. Entonces, ¿qué es visible en la nueva sintaxis?
берем_список(list).превращаем_в_поток(stream).перебираем_все_элементы(forEach)(тут_интуитивно_понятно)
System.out::println— un enlace a un método estático que envía una cadena a la consola. En lugar de un enlace a un método estático, puedes usar una entrada ligeramente diferente y menos clara:
list.stream().forEach(i -> System.out.println(i));
Esta entrada utiliza expresiones lambda. Y sí, para aprender a trabajar con transmisiones, necesitarás aprender expresiones lambda; son maravillosas. Además, no mostraré cómo trabajar con colecciones usando solo flujos, confiando en el hecho de que usted se familiarizó con los métodos tradicionales durante el curso.

Ejemplo 2. Busque valores pares en la lista y muéstrelos en la consola

list.stream().filter(i -> i%2==0).forEach(System.out::println);
Todo el problema se resolvió en una sola línea. Espero que disfrutes trabajando en una sola línea. Usando el método, filterfiltramos la transmisión y enviamos lo que quedaba a la consola. El filtro es algo muy poderoso que puede ayudar en los casos más inesperados. Seamos creativos y cambiemos las condiciones del problema. Por ejemplo, necesitamos contar cuántos números pares hay en la lista:
long count = list.stream().filter(i -> i%2==0).count();
Y de nuevo en una línea. De alguna manera todo parece sencillo. En el filtro, usamos una expresión lambda, colocando así solo números pares en la nueva secuencia, y luego la aplicamos a la nueva secuencia count, que contó cuántos elementos hay en la nueva secuencia.

Ejemplo 3. Contemos cuántas palabras de la lista tienen 5 caracteres

Hemos jugado con números enteros, ahora juguemos con palabras.
List<String> list = new ArrayList<>();
Collections.addAll(list, "разые", "слова", "интересные", "Y", "No", "Muy");

System.out.println(list.stream().filter(w -> w.length() == 5).count());
Usamos el filtro nuevamente. En el filtro, usando una expresión lambda, se mostró una nueva secuencia y luego, comprensiblemente, countcalculé cuántos elementos había en la nueva secuencia.

Ejemplo 4. Imprimir palabras únicas

Una tarea familiar cuando leemos muchas palabras diferentes en una colección de un archivo y ahora solo necesitamos palabras únicas.
List<String> list = new ArrayList<>();
Collections.addAll(list, "vasya", "Таня", "Olia", "vasya", "Olia", "Сергей");

list.stream().distinct().forEach(System.out::println);
La acción principal se realizó en la transmisión usando distinct. A continuación, sugiero echar un vistazo a algunas de nuestras tareas del curso usando hilos.

Ejemplo 5. Palabras largas

En el noveno nivel de Java Core, en la lección 11 hay un problema interesante: en él es necesario escribir palabras separadas por comas en el Archivo 2, cuya longitud sea estrictamente mayor que 6. No importa qué tipo de jardín esté cercando, Propongo la siguiente solución:
  1. Desde el archivo fuente leemos todas las palabras de la lista.

  2. Luego ejecutamos la siguiente línea

    Optional<String> rezult = list.stream()
    				.filter(w->w.length()>6)
    				.reduce((w1,w2)->w1+", "+w2);
  3. result.get()escribir en un archivo.

Aquí hay una solución interesante que utiliza hilos. El filtro se filtró y, utilizando reducir y una expresión regular, se generó la cadena requerida.

Ejemplo 6. Palabras con números

Escriba todas las palabras que contengan números, por ejemplo, a1 o abc3d, separadas por un espacio en Archivo2. Esta también es una condición de nuestro libro de problemas; como habrás adivinado, la solución es sencilla.
Optional<String> rezult = list.stream()
				.filter(w->w.matches(".*?\\d+.*?"))
				.reduce((w1,w2)->w1+" "+w2);
Filtramos la secuencia usando una expresión regular y luego la reducimos y una expresión lambda. Hay mucho en común con la tarea anterior.

Ejemplo 7. Seleccionar números

Toda la tarea suena así:
  • Lea 2 nombres de archivos desde la consola.
  • Envíe al segundo archivo todos los números que están en el primer archivo.
  • Los números están separados por espacios.
  • Cerrar arroyos.
Para la tarea principal, que es escribir números en una cadena separada por espacios, para escribir más en un archivo, sugiero usar una secuencia, se verá así:
Optional<String> rezult = list.stream().filter(w->w.matches("\\d+"))
				.reduce((w1,w2)->w1+" "+w2);
System.out.println(rezult.get());
Utilizando hilos, el problema se soluciona de una forma muy sencilla. Pero, he aquí, compara tú mismo esta solución con las dos anteriores. Para concluir el artículo, quiero confesarles: muchachos, hice trampa al seleccionar ejemplos. El hecho es que elegí los ejemplos más simples para mostrarles un tema desconocido utilizando problemas familiares. Por supuesto, los hilos se utilizan tanto para tareas simples como para tareas más complejas. Pero como enfatizó Horstman en su libro, “los flujos de datos operan según el principio de “qué, no cómo hacer”, lo que significa que muchas tareas que antes eran complejas pueden volverse más simples. No sé ustedes, pero a mí me gustaron los flujos, espero no haberlos desanimado de aprenderlos. Y déjame explicarte una cosa más:
  1. No me propuse enseñar al lector cómo usar transmisiones en colecciones; no soy un maestro con tanta experiencia. ¡Quería mostrarles que los hilos son simples y muy interesantes! En general, esto es una necesidad.
  2. Cuanto más entiendo los flujos, más veo problemas en los que resuelven todos los problemas del libro del curso, lo que significa que los flujos no se inventaron en vano.
  3. No sólo es fácil trabajar con los flujos, sino que también tienen una ventaja importante: cuando se trabaja con grandes cantidades de datos, los flujos suelen ser más productivos.
PD . Estaba bromeando sobre TODOS LOS PROBLEMAS. Recomendar: Biblioteca Java profesional. Volumen 2 Herramientas de programación avanzadas. Kay Horstmann. Tengo la décima edición.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION