Introducci贸n a la programaci贸n Funcional

1

驴Qu茅 es la Programaci贸n Funcional?

Entendiendo las partes de la programaci贸n funcional

2

驴Qu茅 es una funci贸n en Java?

3

Funciones como ciudadanos de primera clase

4

Funciones puras

5

Entendiendo los efectos secundarios

6

Funciones de orden mayor

7

Funciones lambda

8

Inmutabilidad

Functional Programming en Java

9

Repositorio del curso

10

Configuraci贸n del entorno de trabajo

11

Revisando el paquete java.util.function: Function

12

Revisando el paquete java.util.function: Predicate

13

Revisando el paquete java.util.function: Consumer y Supplier

14

Revisando el paquete java.util.function: Operators y BiFunction

15

Entendiendo dos jugadores clave: SAM y FunctionalInterface

16

Operador de Referencia

17

Analizando la inferencia de tipos

18

Comprendiendo la sintaxis de las funciones lambda

19

Usando metodos default en nuestras interfaces

20

D谩ndole nombre a un viejo amigo: Chaining

21

Entendiendo la composici贸n de funciones

Optional y Streams: Datos mas interesantes

22

La clase Optional

23

Entendiendo los Streams

24

驴Qu茅 son los Stream listeners?

25

Operaciones y Collectors

26

Streams de tipo espec铆fico y Paralelismo

27

Operaciones Terminales

28

Operaciones Intermedias

29

Collectors

Todo junto: Proyecto Job-search

30

job-search: Un proyecto para encontrar trabajo

31

Vista r谩pida a un proyecto de Gradle

32

Revisando las opciones para nuestro CLI

33

Librer铆as adicionales para nuestro proyecto

34

Entendiendo la API de jobs

35

Dise帽ando las Funciones Constructoras de nuestro Proyecto

36

Agregando validaciones de datos

37

Dise帽ando las funciones de transformacion de datos

38

Creando flujos extras de transformaci贸n de Datos

Conclusiones

39

Un repaso a lo aprendido

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Inmutabilidad

8/39
Recursos

Aportes 41

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

La clase inmutable que consideras inmutable creo que no es totalmente, porque si esta bien que haga un copiado de la lista cada vez que se llama el metodo get, cuando el objeto se crea por primera vez el valor de la lista 鈥渆mails鈥 que envias no le hace ningun copiado, simplemente lo coloca directamente en el atributo emails de la clase, eso hace que el programador a futuro pueda tomar esa lista que le envio al objeto inmutable y modificarla desde afuera, y al modificarla desde afuera, eso modifica el valor de la referencia que tiene en la clase inmutable.

Escuchando lo de concurrente, estar铆a genial un curso de programaci贸n concurrente con Java y sus Threads. Es algo apasionante.

Ser o no ser inmutable, esa es la cuesti贸n.

Para complementar:

final en Java poco tiene que ver con mutabilidad. Marcar como final un nombre (miembro de clase o variable local) hace que dicho nombre sea read-only una vez el mismo es instanciado.

final myVar = new ArrayList<String>();
myVar = Collections.emptyList(); // Incurre en un error porque myVar es de solo lectura (no se puede re-asignar)

Pero nada evita mutar el objeto referenciado por un nombre marcado como final

final myVar = new ArrayList<String>();
myVar.add("Hello");

Para evitar la mutaci贸n, adem谩s de usar nombres marcados como final, hay que usar tipos de datos inmutables (ArrayList no es uno de ellos), evitar la herencia donde es posible y respetar el principio de sustituci贸n de Liskov cuando no lo es.

Uso de la palabra final en Java

  • En variables: Evita que se modifique el valor almacenado de la variable
  • En m茅todos: Evita que se modifique la definicion del metodo desde subclases o clases hijas
  • En clases: Evita que se creen subclases o clases hijas
final

Inmutabilidad
Un objeto inmutable es aquel cuyo estado no se puede cambiar una vez constru铆do.
Ventajas :
-> Una vez creado no se puede alterar.
-> Facilidad para crear funciones puras.
-> Facilidad para usar threads/concurrencia.
Desventajas :
-> Cuando se necesecite alterar un datos, se requiere crear una nueva instancia por cada set modificado.
-> Requiere especial atenci贸n al dise帽o.
-> Los objetos mutables est谩n fuera de nuestro alcance, porque se vuelven inpredecibles

Como comenta el compa帽ero Carlos Torres, La clase InmutablePerson no qued贸 inmutable realmente. Como los LinkedList son objetos, estos se guardan en una direcci贸n de memoria. Lo anterior ocasiona que cuando se pasa la lista de emails en el constructor este se env铆a como un puntero o referencia a la direcci贸n de memoria del listado. Lo cual implica que si alguien modifica el listado de emails original, el cambio se ver谩 reflejado tambi茅n en el atributo this.emails del objeto ImmutablePerson ya que este apunta a la misma direcci贸n.
Para corregir esto no s贸lo se debe crear una copia de los emails en el getEmails sino tambi茅n en el constructor, por lo tanto el constructor deber铆a quedar as铆:

<code> 
public InmutablePerson(String firsName, String lastName, List<String> emails`){
	this.firstName = firstName;
	this.lastName = lastName;
	this.emails = new LinkedList<>(emails);
}

``

Caray fascinante esta explicaci贸n we :v
toma tu like buen hombre

hasta este punto NO entendi casi nad 馃槮

Excelente clase y cap铆tulo!
Muy claro y conciso todo.

Inmutabilidad

Tanto en la programaci贸n orientada a objetos como en la funcional, un objeto inmutable es aquel cuyo estado no puede ser modificado luego de haber sido instanciado.

Por defecto en Java, los objetos sin mutables, esto significa que luego de tener un objeto en memoria se puede modificar sus atributos utilizando getters y setters, lo que podr铆a alterar el comportamiento del programa si este tipo de objeto se pasa como par谩metro a funciones impuras.

El uso de la inmutabilidad en los objetos conlleva ventajas y desventajas:

Ventajas:

  • No se puede modificar luego de creado.
  • Facilita la creaci贸n de funciones puras.
  • Facilita el uso de hilos evitando problemas deconcurrencia.

Desventajas:

  • Si se quiere modificar, es necesario crear una copia (nueva instancia) del objeto con la modificaci贸n deseada.
  • Se debe prestar atenci贸n en el dise帽o e implementaci贸n para garantizar la inmutabilidad.
  • Existen objetos fuera de alcance (nativos o de librer铆as) que al ser mutables pueden ser inpredecibles.

Jaja, que buenos ejemplos y buen profesor

En Java, para hacer que una clase sea inmutable, debes seguir algunos principios y utilizar ciertas t茅cnicas. Aqu铆 hay algunas recomendaciones para lograrlo:

  1. Declarar la clase como final: Al declarar una clase como final, evitas que pueda ser heredada y modificada por clases hijas.

  2. Declarar los campos como private y final: Al hacerlo, los campos no podr谩n ser modificados desde fuera de la clase despu茅s de su inicializaci贸n. Debes asegurarte de inicializar todos los campos en el constructor o mediante una asignaci贸n directa.

  3. No proporcionar m茅todos mutadores (setters): Evita la creaci贸n de m茅todos que permitan cambiar los valores de los campos despu茅s de la creaci贸n del objeto. Esto garantiza que una vez que se cree un objeto, sus campos permanezcan inmutables.

  4. Evitar el retorno de referencias mutables: Si una clase inmutable contiene campos que son objetos mutables, debes tener cuidado al devolver referencias a esos objetos. Si se devuelve una referencia mutable, se podr铆a modificar el estado interno de la clase inmutable. En su lugar, si es necesario devolver un objeto mutable, deber铆as realizar una copia defensiva del mismo.

  5. Hacer que los campos sean primitivos o inmutables: Al utilizar tipos primitivos como int, boolean, etc., o tipos de datos inmutables como String o BigDecimal, aseguras que los valores de los campos no se puedan modificar despu茅s de la creaci贸n del objeto.

  6. Asegurarse de que la clase no pueda ser extendida: Adem谩s de declarar la clase como final, tambi茅n puedes hacer que el constructor de la clase sea privado o protegido, evitando as铆 que se pueda crear subclases.

Siguiendo estas recomendaciones, puedes crear una clase inmutable en Java, lo que garantiza que los objetos de esa clase no se puedan modificar una vez creados. Esto puede ser 煤til en situaciones donde deseas garantizar la consistencia y la integridad de los objetos.

Excelente clase. El concepto de mutabilidad es muy 煤til e interesante. En lenguajes funcionales esto es mucho m谩s sencillo, pues los datos son inmutables por default y es imposible mutar un dato inmutable. Realmente en Java no hay tipos inmutables, lo que hay son Wrappers que encapsulan los datos mutables dentro de una implementaci贸n de m茅todos que no modifica nada y que impiden la extensi贸n de funcionalidad. Es decir, hay implementaciones inmutables m谩s no tipos de datos o variables inmutables como en Rust o lenguajes netamente funcionales. En mi consideraci贸n, esto impacta el rendimiento de java y la cantidad de cosas que tiene que mirar el garbage collector haci茅ndolo mucho m谩s lento que un lenguaje funcional en el 谩mbito de la inmutabilidad.
records de java 14 en adelante es una manera muy bella de crear Clases inmutables. <https://www.baeldung.com/java-record-keyword>

Es la clase mas rompe cocos q he visto wey, q fascinante.

Todo muy claro y sinceramente son cosas que se deben de tener en cuenta mas que todo en datos o informacion importante. Una pregunta: final recuerdo lo he utilizado para crear este tipo de objetos:

public static final String[] MONTHS = {"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"};```

Se utilizo FINAL con la finalidad de indicar que era una constante (pues los meses del a帽o siempre seran 12 y los mismos) y pues que no cambian. En este caso se estaria manejando Inmutabilidad ??? No lo he intentado, pero a pesar de haberlo creado asi, si yo intento en alguna funcion, clase, metodo intentar asignarle o cambiarle algun valor me imagino podria afectar, en ese caso como evito la mutabilidad?? A mi locamente en estos momentos se me ocurre crear alguna variable y guardar esa misma informacion, al momento de necesitar Months colocar una condicion que averigue si siguen siendo iguales.

Gracias.

Gracias 馃槂

Aqui mi aporte, por si no les quedo muy claro. Por lo que entend铆 es que la inmutabilidad hace que tu c贸digo sea m谩s seguro, m谩s predecible y m谩s f谩cil de trabajar, especialmente en situaciones donde hay concurrencia o cuando quieres asegurarte de que los datos no cambien accidentalmente. EJEMPLO: Imagina que tienes un objeto como una caja que contiene algunos datos. Si esa caja es mutable, significa que puedes abrir la caja y cambiar los datos que contiene en cualquier momento. Por otro lado, si esa caja es inmutable, una vez que la has sellado con esos datos dentro, no puedes abrir la caja para cambiarlos. ```java // Ejemplo de clase mutable class MutablePerson { private String name; public MutablePerson(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } // Ejemplo de clase inmutable final class ImmutablePerson { private final String name; public ImmutablePerson(String name) { this.name = name; } public String getName() { return name; } // No hay un m茅todo setter, lo que hace que esta clase sea inmutable } public class Main { public static void main(String[] args) { // Crear un objeto mutable MutablePerson mutable = new MutablePerson("Juan"); System.out.println("Mutable: " + mutable.getName()); // Cambiar el nombre del objeto mutable mutable.setName("Maria"); System.out.println("Mutable despu茅s de cambiar el nombre: " + mutable.getName()); // Crear un objeto inmutable ImmutablePerson immutable = new ImmutablePerson("Pedro"); System.out.println("Inmutable: " + immutable.getName()); // Intentar cambiar el nombre del objeto inmutable (esto dar谩 un error de compilaci贸n) // immutable.setName("Luis"); // Esto no compilar谩 porque no hay m茅todo setName en ImmutablePerson } } ```
Aqui mi aporte, pr si no les quedo muy claro. Por lo que entend铆 es que la inmutabilidad hace que tu c贸digo sea m谩s seguro, m谩s predecible y m谩s f谩cil de trabajar, especialmente en situaciones donde hay concurrencia o cuando quieres asegurarte de que los datos no cambien accidentalmente. EJEMPLO: Imagina que tienes un objeto como una caja que contiene algunos datos. Si esa caja es mutable, significa que puedes abrir la caja y cambiar los datos que contiene en cualquier momento. Por otro lado, si esa caja es inmutable, una vez que la has sellado con esos datos dentro, no puedes abrir la caja para cambiarlos. ```js // Ejemplo de clase mutable class MutablePerson { private String name; public MutablePerson(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } // Ejemplo de clase inmutable final class ImmutablePerson { private final String name; public ImmutablePerson(String name) { this.name = name; } public String getName() { return name; } // No hay un m茅todo setter, lo que hace que esta clase sea inmutable } public class Main { public static void main(String[] args) { // Crear un objeto mutable MutablePerson mutable = new MutablePerson("Juan"); System.out.println("Mutable: " + mutable.getName()); // Cambiar el nombre del objeto mutable mutable.setName("Maria"); System.out.println("Mutable despu茅s de cambiar el nombre: " + mutable.getName()); // Crear un objeto inmutable ImmutablePerson immutable = new ImmutablePerson("Pedro"); System.out.println("Inmutable: " + immutable.getName()); // Intentar cambiar el nombre del objeto inmutable (esto dar谩 un error de compilaci贸n) // immutable.setName("Luis"); // Esto no compilar谩 porque no hay m茅todo setName en ImmutablePerson } } ```// Ejemplo de clase mutable class MutablePerson { private String name; public MutablePerson(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } // Ejemplo de clase inmutable final class ImmutablePerson { private final String name; public ImmutablePerson(String name) { this.name = name; } public String getName() { return name; } // No hay un m茅todo setter, lo que hace que esta clase sea inmutable } public class Main { public static void main(String\[] args) { // Crear un objeto mutable MutablePerson mutable = new MutablePerson("Juan"); System.out.println("Mutable: " + mutable.getName()); // Cambiar el nombre del objeto mutable mutable.setName("Maria"); System.out.println("Mutable despu茅s de cambiar el nombre: " + mutable.getName()); // Crear un objeto inmutable ImmutablePerson immutable = new ImmutablePerson("Pedro"); System.out.println("Inmutable: " + immutable.getName()); // Intentar cambiar el nombre del objeto inmutable (esto dar谩 un error de compilaci贸n) // immutable.setName("Luis"); // Esto no compilar谩 porque no hay m茅todo setName en ImmutablePerson } }
This is the same result using Java records. ```js package study.java; import java.util.LinkedList; import java.util.List; public record Person(String name, String lastname, List<String> emails) { @Override public List<String> emails() { return new LinkedList<>(emails); } } ```package *study.java*; import *java.util.LinkedList*; import *java.util.List*; public record *Person*(*String* name, *String* lastname, *List*<*String*> emails) { *@Override* ** public *List*<*String*> *emails*() { return new *LinkedList*<>(emails); } }

Hola, cuando dices que una funci贸n que no genere efectos secundarios es mas f谩cil de meter en diferentes procesadores, te refieres a que es mas facil de meter en diferentes n煤cleos? Gracias

鈥淧lain Old Java Object鈥 (Objeto Java Sencillo y Antiguo)

.

  • Los POJOs son clases simples que encapsulan datos y tienen m茅todos para acceder y manipular esos datos.

Esta clase la tuve que ver dos veces despu茅s de bajar el proyecto. Pero me quedo much铆simo m谩s claro el concepto y es algo que jam谩s me hab铆a puesto a pensar en mis desarrollos: la mutabilidad e inmutabilidad. El ejercicio de realizar copias de los datos y regresar esas copias es bestial y me ilumin贸 para muchas soluciones en mis desarrollos.

Siento que hizo falta explicar la diferencia entre tipos de datos primitivos y los de tipo referencia, yo solo entendi gracias a que ya sab铆a ese tema.

Inmutabilidad

  • Ventajas de datos inmutables
  1. Una vez creado no se puede alterar.
  2. Facilita crear funciones puras.
  3. Facilita usar threads/concurrencia.
  • Desventajas
  1. Nueva instancia por cada set de modificaciones.
  2. Requiere especial atenci贸n al dise帽o.
  3. Objetos mutables fuera de nuestro alcance, no tenemos acceso a ellos.

Excelente clase, cambio mi manera de pensar sobre crear objetos mutables, me gustar铆a que realizaran un curso sobre la protecci贸n de datos en java y la inmutabilidad.

Excelente capitulo, hay mucho que aprender

Excelente!

Quiza me perdie pero prefiero preguntar que quedarme con la duda, entiendo entonces que para dicha clase en java debemos colocar la clase como final. Asi deberia ser cuando estemos programando ? Tengo esa duda.

Excelente clase instructor Sinuh茅, no conoc铆a esa vulnerabilidad que ten铆a la creaci贸n de objetos mutables respecto a la manipulaci贸n de datos.

En cuanto a la clase que se cre贸 para generar objetos inmutables se utiliz贸 la palabra final tanto en la clase como los atributos o propiedades para evitar lo modificaci贸n, el m茅todo que exige todas las propiedades y por ultimo permiti贸 que se generara una copia de la lista de correos.

Muchas gracias por la clase instructor Sinuh茅.

Buena clase

Genial 馃槂

Excelente, muy bueno.

Tenia entendido que con declarar los m茅todos privados y utilizar los getters y setters nos proteg铆amos de alteraciones a los par谩metros del c贸digo pero esto no me lo esperaba, es algo nuevo saber que una funci贸n de librer铆a pueda alterar los valores finales de c贸digo as铆.

Esta clase llamo mi atenci贸n, seguimos adelante. Gracias !

Incre铆ble como debemos siempre de preocuparnos como pueden alterar el comportamiento de nuestro c贸digo. Siempre debemos en la medida de lo posible y cuando se necesite evitar que nuestras funciones sean alteradas bajo este principio, para garantizar la integridad de la informaci贸n.

Excelente clase!!! 馃憤馃徑

Woow excelente la inmutabilidad primera vez que lo veo

Increible el principio de inmutabilidad