JavaRush /Blog Java /Random-ES /Lambdas y streams, solo práctica, no teoría

Lambdas y streams, solo práctica, no teoría

Publicado en el grupo Random-ES
Hola a todos. Con motivo del concurso, decidí escribir aquí no un artículo, sino una breve lección. Se tratará de lambdas y streams en Java. Si ya está familiarizado con ellos y los utiliza, vaya directamente al final del artículo, habrá una pequeña selección de tareas con JavaRush con las que podrá practicar. Necesita Java 8 y superior, entrenamiento de JR, habrá pocos detalles y muchas cosas incomprensibles, un fuerte deseo de resolverlo. Para empezar, no explicaré la historia de la aparición de lambdas y streams, simplemente no lo sé. Sólo sé que vinieron del estilo de programación funcional, a nuestro estilo POO. En mi corta experiencia de aprendizaje, simplemente mostré cómo y qué, a algunas personas les resulta difícil entender la idea, así que recuerda cómo escribir, lo entenderás más tarde.

lambdas

Lambdas y streams, solo práctica, no teoría - 1Lambdas y streams, solo práctica, no teoría - 2Si no sabe en absoluto qué son las lambdas, entonces: Una lambda tiene este aspecto:
(a, b) -> a.compareTo(b)
(переменные) -> действие
Es suficiente por ahora. Puedes leer la teoría aquí: enlace uno , enlace dos , pero creo que la práctica es mucho más divertida. Te sugiero que resuelvas el siguiente problema: Escribe una calculadora usando el método 1. El método debería aceptar 2 valores digitales y algo más. Su código se verá así:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
Debe ingresar 3 parámetros en la firma del método calculate, agregar 1 comando returny probar la llamada a este método main. ¿Qué debería poder hacer este método?
  • doblar;
  • multiplicar;
  • dividir;
  • sustraer;
  • calcular la raíz;
  • elevar a una potencia;
  • elevar a una potencia la suma de argumentos dividida por el primer número + 117;
  • y todas las demás operaciones que se te ocurran.
Qué no usar:
  • if-else;
  • charcomo indicador de operación;
  • switch-case;
  • y todo lo que se te ocurra.
Qué puedes usar:
  • Sólo lambdas, la tarea recae en ellos.
- ¿Qué? ¿Y eso es todo? - Sí, eso es todo, porque literalmente necesitas agregar 3 líneas, si sugiero al menos una, el resto se escribirá automáticamente. Y si quieres, puedes buscar ejemplos en Google e intentar entenderlos. Por supuesto, te controlarás a ti mismo y si haces trampa, nadie lo sabrá, pero ¿por qué entonces? Habiendo resuelto un problema tan simple, todos mis estudiantes de 1.5 obtuvieron una comprensión aproximada de qué son las lambdas y cómo usarlas. Esto será muy necesario para la transmisión. Si quieres presumir del resultado y saber si lo hiciste bien, envía el código por mensaje privado. No es necesario comentar, allí puedes añadir consejos interesantes (pero de forma que no facilites demasiado la tarea). Nuevamente, una vez resuelto este ejemplo, ya debería tener una comprensión aproximada de cómo usar lambdas.
Lambdas y streams, solo práctica, no teoría - 3
Ahora pasemos a las secuencias de Java. Estas no son las corrientes en las que usted, el lector, puede haber pensado. No, no lo es inputStreamy no lo es OutputStream. Es diferente, es más interesante. Las corrientes han reemplazado a los ciclos, no completamente, pero aún así. Se sirven con el lema “no expliques cómo hacerlo, explica qué hacer”. Un pequeño ejemplo de una secuencia:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
¿Que está pasando aqui? Agreguemos comentarios:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
Comparar con un bucle normal:
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
Cuando lees el código, todo parece aterrador, pero ¿es más fácil con los comentarios? Esto es normal, yo tampoco los entendí durante mucho tiempo. La clave para la comprensión es la práctica. Por lo tanto, comenzamos a leer artículos de terceros y a buscar respuestas a nuestras preguntas, también puedes preguntarlas aquí en los comentarios, no daré una respuesta completa, pero señalaré la dirección. Lista de tareas de JavaRush que creo que son geniales para practicar el streaming:
  • 2208: se puede resolver con 1 flujo y 1 retorno, es decir el cuerpo del método comenzará con returny luego habrá 1 flujo completo. Omitamos el requisito StringBuilder.

  • 1908: también puedes resolverlo con 1 flujo y 1 retorno. Comenzando con la lectura del archivo. No sé cómo grabar en un archivo mediante transmisiones (si es posible), por ahora lo hacemos manualmente. Aquellos. Abrimos solo 2 transmisiones (consola y escritura en un archivo). Leemos el archivo a través de métodos que nos devolverán una hoja o una secuencia (google y javadoc).

  • 1907: en teoría, también se puede resolver en una sola corriente. La entrada a la secuencia es el nombre del archivo, la salida es el número de palabras del mundo.

Eso es todo. Si puedo, escribiré otra historia sencilla. En mi opinión, leer sobre algo interesante sin la oportunidad de probarlo es algo aburrido o algo así. Y después de la calculadora y 3 acertijos, creo que ya te llevas bien con lambdas y streams, así que lee sobre todas las posibilidades si aún no lo has hecho. ACTUALIZACIÓN:
  • 1016 - de una manera ligeramente pervertida, puedes resolverlo en 1 secuencia y 1 retorno;

  • 1821 - muy fácil y en 1 corriente y 1 regreso.

    Estas 2 tareas le presentarán otro método de transmisión y otro recopilador.

  • 1925: puedes obtener una línea con palabras en una secuencia y luego escribirla en un archivo (no sé si es posible escribir en un archivo desde una secuencia)

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION