He creado un meme 🙃
Introducción a la programación Funcional
Programación Funcional en Java: Conceptos y Aplicaciones Prácticas
Entendiendo las partes de la programación funcional
Funciones en Programación Funcional: Conceptos Básicos
Funciones como Ciudadanos de Primera Clase en Programación
Funciones Puras: Concepto y Ejemplos Prácticos
Efectos Secundarios en Programación y su Impacto en el Código
Funciones de Orden Superior en Programación
Funciones Lambda en Programación Funcional Java
Inmutabilidad de Datos en Programación Funcional con Java
Functional Programming en Java
Programación Funcional en Java SE: Conceptos y Prácticas
Programación Funcional en Java: Práctica y Ejemplos en IntelliJ
Programación Funcional en Java: Creación y Uso de Funciones
Programación Funcional con Predicados en Java
Interfaz Consumer y Supplier en Java: Uso y Ejemplos Prácticos
Funciones Java para Transformación de Datos y Operaciones Binarias
Creación y Uso de Interfaces Funcionales Personalizadas en Java
Métodos de Referencia en Programación Funcional Java
Inferencia de tipos en Java: funciones y métodos
Uso de Expresiones Lambda en Java: Sintaxis y Aplicaciones
Interfaz Funcional en Java: Creación y Uso de Métodos Default
Encadenamiento de Llamadas en Programación Orientada a Objetos
Composición de Funciones en Programación Funcional
Optional y Streams: Datos mas interesantes
Uso de la Clase Optional en Java para Manejo de Valores Nulos
Manipulación de Streams en Java: Operaciones y Limitaciones
Programación Funcional en Java: Uso de Streams y Operaciones Terminales
Operaciones de Stream en Java: Intermedias y Finales
Operaciones y Concurrente con Stream en Java
Operaciones Terminales en Java Streams
Operaciones Intermedias en Streams de Java
Conversión de Strings a Listas de Enteros en Java
Todo junto: Proyecto Job-search
Construcción de Proyecto para Buscar Empleo Usando APIs
Configuración y Uso de Gradle en Proyectos Java con IntelliJ
Creación de una Herramienta de Búsqueda de Trabajo en Terminal
Creación de Puntos de Entrada y Dependencias en Proyectos Java
Creación de APIs RESTful con Feign y Spring Boot
Creación de una Interfaz de Línea de Comandos con JCommander
Validación de Argumentos en Terminal con Clases en Ciel
Procesamiento de Argumentos y Solicitudes API en Java
Creación de API para búsqueda de empleos con Java y CLI
Conclusiones
Programación Funcional en Java: Conceptos y Aplicaciones
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Las funciones lambda en Java son una herramienta poderosa que permite crear funciones anónimas, facilitando el manejo y manipulación de expresiones funcionales de manera clara y concisa. Estas funciones permiten introducir bloques de código más compactos que pueden ser evaluados en tiempo de ejecución sin necesidad de almacenarse bajo un nombre específico. Aprender a utilizar las funciones lambda correctamente es esencial para cualquier desarrollador que quiera emplear programación funcional en Java.
Las lambdas ofrecen varias ventajas:
La sintaxis básica de las funciones lambda se puede descomponer en los siguientes elementos:
Runnable noArguments = () -> System.out.println("Hello World");
Consumer<String> greet = name -> System.out.println("Hello, " + name);
BiFunction<Integer, Integer, Integer> add = (a, b) -> {
System.out.println("Adding numbers: " + a + " + " + b);
return a + b;
};
Las lambdas se implementan generalmente mediante interfaces funcionales, que son interfaces definidas con una sola función abstracta. Esto permite a Java inferir el tipo de la lambda automáticamente, reduciendo así verborrea de código.
@FunctionalInterface
public interface Operate {
int operation(int a, int b);
}
Usarla con una lambda:
Operate addition = (a, b) -> a + b;
Java permite que las funciones sean pasadas como argumentos gracias a las lambdas, comúnmente conocidas como higher-order functions. Estas funciones pueden recibir una lambda como argumento o devolver una.
public static void executeOperation(Operate op, int x, int y) {
int result = op.operation(x, y);
System.out.println("Result: " + result);
}
executeOperation((a, b) -> a - b, 10, 5); // Resultado: 5
Integer
en lugar de int
.Al adoptar las lambdas y otras características de la programación funcional, los desarrolladores de Java pueden escribir código más limpio y eficiente, simplificando operaciones que de otra manera serían mucho más complejas. ¡Así que sigue explorando y mejorando tus habilidades con las lambdas en Java!
Aportes 25
Preguntas 3
He creado un meme 🙃
Lambda que recibe un parámetro y realiza una operación simple:
text -> System.out.println(text)
Lambda que no recibe parámetros y realiza una operación de retorno simple:
() -> "Hello world"
Lambda que recibe un solo parámetro y realiza una operación de retorno simple:
x -> x % 2 == 0
Lambda que recibe varios parámetros:
(x, y) -> x * y
Lambda que realiza varias operaciones:
(x, y) -> {
System.out.println("Suma de x: " + x + ", y: " + y);
System.out.println(x + y);
}
Lambda que realiza varias operaciones y retorno:
(x, y) -> {
System.out.println("Suma de x: " + x + ", y: " + y);
return x + y;
}
Lambda con tipado de parámetros:
(String text) -> System.out.println(text);
Lambda que retorna un dato que ocupa varias lineas:
() -> (
"<div class='movieSearch'>" +
" <div class='movie-close'>" +
" <button class='movie-close-button'>" +
" <figure>" +
" <img src='src/images/close.png'>" +
" </figure>" +
" </button>" +
" </div>" +
"</div>"
)
Lambda que no recibe por parámetros nada y tampoco retorna nada:
() -> {}
() -> System.out.println("No recibo nada")
() -> {
System.out.println("No recibo nada");
System.out.println("No retorno nada");
}
Sintaxis de lambdas
Si la lambda NO recibe argumentos:
( ) -> operación
Si la lambda recibe 1 argumento:
_argumento -> operación
( argumento ) -> operación_
Si la lambda recibe mas de 1 argumento:
( argumento1, argumento2) -> operación
Si la lambda recibe varias operaciones:
( ) -> { operacion1; return operación2; }
argumento -> { operacion1; return operacion2; }
( argumento ) -> { operacion1; return operacion2; }
( argumento1, argumento2) -> { operacion1; return operacion2 }
Si la lambda tiene mas de una operación debemos retornar un valor mediante.
return
Pero si NO devuelve nada, solo hay que indicar el tipo de entrada vacío.
( ) -> { operación }
Para evitar errores es mejor usar
( ) -> { operación }
para cualquier caso.
javascript me preparo para este momento ;D
Lambda expressions basically express instances of functional interfaces (An interface with single abstract method is called functional interface. An example is java.lang.Runnable). lambda expressions implement the only abstract function and therefore implement functional interfaces
Lambda expressions are added in Java 8 and provide below functionalities.
Enable to treat functionality as a method argument, or code as data.
A function that can be created without belonging to any class.
A lambda expression can be passed around as if it was an object and executed on demand.
Cómo puedo agregar esa configuración a mi teclado para la flecha?
Las funciones lambdas solo esta presente en donde se crean y son funciones cortas y simples
package com.platzi.functional._08_lambda;
import com.platzi.functional._06_reference_operator.NombresUtils;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Predicate;
public class Sintaxis {
public static void main(String[] args) {
List<String> cursos = NombresUtils.getList("Java", "Functional");
// Esta es una lambda que solo retorna la impresion de un curso
cursos.forEach(curso -> System.out.println(curso));
// Una lambda en su minima expresion (solo retorna el 2)
usarZero(() -> 2);
// El predicate retorna true o false
usarPredicado((texto) -> texto.isEmpty());
// Puede recibir 2 parametros
usarBiFunction((x, y) -> x * y);
// Con mas operaciones se debe especificar donde esta el return
usarBiFunction((x, y) -> {
System.out.println(x + " + " + y);
return x + y;
});
// Cuando no se recibe nada y no se retorna ningun resultado
usarNada(() -> {
System.out.println("No hago nada, porque no retorno nada");
});
// Se pueden especificar los tipos de datos pero no es muy comun encontrarlo en proyectos
usarBiFunction((Integer x, Integer y) -> x * y);
}
// estas funciones son high order functions usadas para poder pasar la funciones lambda como parametros
static void usarZero(ZeroArguments zeroArguments){
}
static void usarPredicado(Predicate<String> predicate){
}
static void usarBiFunction(BiFunction<Integer, Integer, Integer> biFunction){
}
static void usarNada(OperarNada operarNada){
}
@FunctionalInterface
interface ZeroArguments{
int get();
}
@FunctionalInterface
interface OperarNada{
void nada();
}
}
LA MEJOR CLASE 😎
⠀
Las funciones Lambda son funciones anónimas, es decir, no están asignadas a variables (Function
, Predicate
, Consumer
, etc), sino que se definen en el momento en que son usadas y al no nombrarse no es posible volverlas a usar.
⠀
Por ejemplo, para mostrar una lista de String
, es posible utilizar el método forEach
que para cada elemento de la lista aplicará la expresión pasada como parámetro.
List<String> numeros = Arrays.asList("uno", "dos", "tres");
numeros.forEach(texto -> System.out.println(texto));
La sintáxis de las Lambdas varía dependiendo de su estructura:
(x, y) -> ...
, pero si sólo es uno no son necesarios.->
y no es necesario usar ;
. Si son dos o más lineas, se deben usar llaves -> { ... }
y ;
en cada línea.return
.✅
Justo iba a preguntar que pasaba si la logica era mas grande y fue solo agregar las llaves. Gracias!
Esto me recuerda a las Arrow Functions de Javascript, y hasta su sintaxis es muy similar.
Bien explicado y detallado como para entender… gracias.
¿Alguno sabe como obtener los {} de colores que tiene el profe por jerarquia? es muy util a la hora de debugear
las funciones al ser interfaces trabajan directamentes en objetos mo trabajan sobre de tipos de datos primitivos
Excelente información
Entonces bajo lo que vimos en el video en caso de requerirlo puedo hacer una clase que tenga los métodos “usarAlgo” y llamarlos para crear lamdas sin tener que hacer la declaración larga BiFunction<Integer,Integer,Integer> s = (x,y) -> x*y;
IsEmpty (si es vacio) devuelve un valor de tipo booleano que indica true si el tamaño de la cadena es igual a 0
Gracias por los ejempos… queda mas claro con ello 😃
Muchas gracias por la clase instructor Sinuhé, tendré en cuenta esta herramienta cuando quiera añadir funcionalidades de forma rápida y se usen en sola una ocasión, además de tener cuidado de usar objetos en vez de tipos de datos primitivos para que no se generen errores.
Genial.
Las funciones son interfaces, por lo cual no aceptan Tipo de Dato PRIMITIVO, sino tipo de datos OBJETOS o WRAPPER.
Maneras creativas de definir nuestro código que nos permite realizar operaciones que solo se usaran para esa parte especifica del código, pero soy más partidario de definir los tipos de datos para que sea mucho más fácil de entender el código, aunque con solo leer el código veríamos cual es el tipo pero es más fácil solo verlo.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?