Modulo 1
Modulo 1
Conceptos básicos
¿Qué es un método en POO?
Car car = new Car()
car.run()
Un método define el comportamiento de los objetos que se crean a partir de la clase. Un método
es una acción que un objeto puede realizar.
car.addSpeed(2)
cal(𝒙) = 2𝒙
</center>
Lo que significa que estamos declarando una función llamada cal y toma un argumento llamado 𝒙
y multiplica 𝒙 por 2.
<center>
cal(2)
</center>
Paradigma descriptivo
En la programación imperativa se describe paso a paso un conjunto de instrucciones que
deben ejecutarse para variar el estado del programa y hallar la solución, es decir, un algoritmo en
el que se describen los pasos necesarios para solucionar el problema.
Programación imperativa
Es un lenguaje formal que proporciona una serie de instrucciones que permiten a un
programador escribir secuencias de órdenes y algoritmos a modo de controlar el comportamiento
físico y lógico de una computadora con el objetivo de que produzca diversas clases de datos
intersection(List.of(1,7,3), List.of(4,5,6));
[]
Listo, una solución clara, que podemos leer de arriba a abajo y de izquierda a derecha, en el más
puro estilo imperativo. Podríamos decir que, desde el punto de vista de java, nuestro código tiene
un nivel bajo de abstracción, y de hecho la única abstracción sería el uso de add(), get() y el sort()
del final, por supuesto.
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
List<Integer> a = Arrays.asList(2, 4
, 5 );
List<Integer> b = Arrays.asList(5, 4 , 1 );
intersection.apply(a,b)
[4, 5]
Principios y fundamentos
Función pura
Una función pura es que:
22
22
12
Función de composición
La composición de funciones es el proceso de combinar dos o más funciones para producir una
nueva función o realizar algún cálculo. Por ejemplo, la composición f. g (el punto significa
“compuesto con”) es equivalente a f (g (x)).
Todo tiene que ver con la creación de pequeñas funciones reutilizables que puede combinar para
componer nuevas funciones.
import java.util.function.Function;
//composedB.apply(3);
composedA.apply(3);
Currier es…
BiFunction<Integer,Integer,Integer> adder = (a, b) -> a + b ;
Function<Integer,Function<Integer,Integer>> currier = a -> b ->
adder.apply( a, b ) ;
// ( 4 + 3 )
System.out.printf("Curry : %d", curried.apply( 3 ));
Curry : 7
java.io.PrintStream@1da806e2
class DriveCar {
public void run(){
this.speed = 10;
}
public void addSpeed(Speed v){
this.speed = v.advance(this.speed++);
}
● Cuando evita el estado compartido, el tiempo y el orden de las llamadas a las funciones no
cambian el resultado de llamar a la función. Con funciones puras, con la misma entrada,
siempre obtendrá la misma salida.
● La programación funcional establece que las funciones deben evitar estados mutables.
Eso significa que no deben asignar ni actualizar ningún estado de un objeto.
● Las funciones son independientes en sus ejecuciones y aseguran que no haya efectos
secundarios durante su ejecución.
System.out.println(val2);
x1.apply(val2);
x2.apply(x);
System.out.println(val2);
6
6
Este es uno de los principios básicos de la programación funcional. Si paso un valor a una
función, puedo prometer que se mantendrá igual para siempre.
list2.add(2);//java.lang.UnsupportedOperationException
System.out.println(list2);
-----------------------------------------------------------------------
----
java.lang.UnsupportedOperationException: null
at
java.base/java.util.Collections$UnmodifiableCollection.add(Collections.
java:1060)
at .(#89:1)
Una mónada es algo muy simple, pero extremadamente poderoso. Una mónada un conjunto de
tres cosas:
Por otro lado flatMap(), proyecta una lista de elementos de cada elemento original y los
concatena en un único stream.
import java.util.HashMap;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
personMap.find("Name")
.flatMap(Person::getAddress)
.flatMap(Address::getCity)
.ifPresent(example.process);
}
@Override
public String toString(){
return name;
}
}
}
Main.main(new String[]{});
Medellin
1
4
9
16
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-csv</artifactId>
<version>2.10.3</version>
</dependency>
Caso de uso
Se tiene un archivo CSV donde se tiene unos jugadores de Fútbol de varias nacionalidades y
diferentes cluds. Se tiene un modelo para realizar el mapeo y posteriormente integrar estos
modelos, donde le podemos aplicar filtros y demás funciones completas de Java.
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonPropertyOrder({"id","name","age","photo","nationality", "flag",
"overall", "potential", "club"})
public class Player {
En esta clase nos soporta un método de utilidad para obtener los jugadores de un archivo
externo.
import com.fasterxml.jackson.databind.MappingIterator;
import com.fasterxml.jackson.dataformat.csv.CsvMapper;
import com.fasterxml.jackson.dataformat.csv.CsvParser;
import java.io.*;
import java.util.List;
.enable(CsvParser.Feature.IGNORE_TRAILING_UNMAPPABLE)
.readerWithTypedSchemaFor(Player.class)
.readValues(csvfile);
return personIter.readAll();
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
}
}
import java.util.List;
import java.util.stream.Collectors;
public List<Player> getPlayersWithMaxAge(List<Player> list, int age) {
return list.stream()
.filter(player -> !player.getAge().isEmpty())
.filter(player -> {
var parseAge = Integer.parseInt(player.getAge());
return parseAge > age;
}).collect(Collectors.toList());
}
● java.util.function.Consumer;
● java.util.function.Function;
● java.util.function.Supplier;
● java.util.function.Predicate;
● java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.function.Predicate;
import java.util.function.BiFunction;
//print.accept(knowLength.apply(world.get()));
if(equal.test("hola")){
print.accept("OK");
}
class Tupla {
final Integer x;
final Integer y;
Tupla(Integer x, Integer y){
this.x = x;
this.y = y;
}
}
add.apply(3, () -> {
return 100;
})
103
FormatPlayer(Player player){
this.name = player.getName();
this.club = player.getClub();
}
A. Vidal - FC Barcelona
Abel Ruiz - FC Barcelona
Aleñá - FC Barcelona
Arthur - FC Barcelona
C. Lenglet - FC Barcelona
Chumi - FC Barcelona
Coutinho - FC Barcelona
Denis Suárez - FC Barcelona
Ezkieta - FC Barcelona
Guillem Jaime - FC Barcelona
I. Rakitić - FC Barcelona
Iñaki Peña - FC Barcelona
J. Cillessen - FC Barcelona
Jordi Alba - FC Barcelona
Jorge Cuenca - FC Barcelona
L. Messi - FC Barcelona
L. Suárez - FC Barcelona
M. Wagué - FC Barcelona
M. ter Stegen - FC Barcelona
Malcom - FC Barcelona
Miranda - FC Barcelona
Munir - FC Barcelona
Nélson Semedo - FC Barcelona
O. Dembélé - FC Barcelona
Oriol Busquets - FC Barcelona
Piqué - FC Barcelona
Rafinha - FC Barcelona
Riqui Puig - FC Barcelona
S. Umtiti - FC Barcelona
Sergi Roberto - FC Barcelona
Sergi Samper - FC Barcelona
Sergio Busquets - FC Barcelona
T. Vermaelen - FC Barcelona
interface Calculator {
double clc(Integer a, Integer b);
}
class Executor {
public static ExecutorApply calculator(Calculator cal){
return cal::clc;
}
interface ExecutorApply {
double with(Integer a, Integer b);
}
}
class MyCal {
public double power(int inputA, int inputB){
return Executor.calculator((a, b) -> a*b).with(inputA,inputB);
}
}