Está en la página 1de 20

Imagen obtenida de: https://i.pinimg.com/originals/0d/14/7c/0d147c411a8ce284e733b4db4294712a.

jpg

Objetos

Mtro. Jorge Rodríguez Castro


Orientada a
Programación
Ingeniería de Sistemas e Informática
Dudas de la clase anterior

• Expresión lambda.
• Tipos de expresiones lambda.
• Interfaz funcional.
• Relación entre interfaz funcional y expresión lambda.

2
Expresiones lambda
(parte II)

S13.s02

3
Logro de aprendizaje

Al finalizar la sesión el
estudiante conocerá qué son
las expresiones lambda y las
aplicará en la solución de
problemas, creando
aplicaciones en el lenguaje
Java.

Imagen extraída de: https://static.vecteezy.com/system/resources/previews/008/822/251/original/3d-target-object-with-transparent-background-png.png 4


Contenido de la sesión

1. Expresiones lambda como argumentos.


2. Expresiones lambda con objetos.
3. Práctica.

5
1. Expresiones lambda
como argumentos

6
Expresiones lambda como argumento

Pasar una expresión lambda como argumento da la


oportunidad de pasar código ejecutable como argumento de
un método.

Archivos de demostración:
LambdaDemo6Test.zip
LambdaDemo6Test.java
StringFunc.java
StringUtil.java
7
Referencias a métodos

• Provee una forma de referirse a un método sin ejecutarlo.


• Se relaciona con expresiones lambda pues se requiere
también un contexto de tipo objetivo a partir de una interfaz
funcional.
• Si la referencia es a un método estático, la sintaxis es:
NombreClase::nombreMetodo
• Si la referencia es a un método de instancia, la sintaxis es:
Objeto::nombreMetodo

8
Referencias a métodos. Ejemplo.
@FunctionalInterface
La clase MyIntPredicates contiene …Por lo tanto, es posible utilizar
public interface IntPredicate {
métodos estáticos compatibles con la referencias a estos métodos cuando se
boolean test(int n); interfaz funcional IntPredicate… invoque al método numTest
}

public class MyIntPredicates { public static void main(String[] args) {


static boolean isPrime(int n) { boolean result;
if (n < 2) return false;
for (int i = 2; i < n / i; i++) { result = numTest(MyIntPredicates::isPrime, 17);
if (n % i == 0) return false; if (result) System.out.println("17 is prime");
}
return true; result = numTest(MyIntPredicates::isEven, 12);
} if (result) System.out.println("12 is even");

static boolean isEven(int n) { result = numTest(MyIntPredicates::isPositive, 11);


return n % 2 == 0; if (result) System.out.println("11 is positive");
} }

static boolean isPositive(int n) { static boolean numTest(IntPredicate p, int v) {


return n > 0;
} return p.test(v);
} }
9
Fuente: Schildt, Herbert; “Java A Beginner’s Guide Eight Edition”. Oracle Press. 2019
Referencias a métodos. Ejemplo.
Referencia a métodos de instancia.

@FunctionalInterface public static void main(String[] args) {


public interface IntPredicate { boolean result;
boolean test(int n); MyIntNum myIntNum1 = new MyIntNum(12);
} MyIntNum myIntNum2 = new MyIntNum(16);

IntPredicate predicate = myIntNum1::isFactor;


public class MyIntNum {
private int num; result = predicate.test(3);
MyIntNum(int num) { this.num = num; } if (result)
int getNum() { return num; } System.out.println("3 is a factor of " +
myIntNum1.getNum());
boolean isFactor(int m) {
return num % m == 0; predicate = myIntNum2::isFactor;
}
} result = predicate.test(3);
if (!result)
System.out.println("3 is not a factor of " +
myIntNum2.getNum());
}
Fuente: Schildt, Herbert; “Java A Beginner’s Guide Eight Edition”. Oracle Press. 2019 10
Interfases funcionales predefinidas
public class BinaryOperatorDemoTest {
public static void main(String[] args) {
• Runnable BinaryOperator<Integer> maxAbsoluto = BinaryOperator.maxBy((a, b) ->
Math.abs(a) - Math.abs(b)
• Comparable );

• ActionListener BinaryOperator<Integer> maxCeros = BinaryOperator.maxBy((a, b) -> {

• Callable String strA = String.valueOf(a);


String strB = String.valueOf(b);

• Consumer int zerosA = strA.length() - strA.replace("0", "").length();


int zerosB = strB.length() - strB.replace("0", "").length();
• Predicate
});
return zerosA - zerosB;

• Function
System.out.println(maxAbsoluto.apply(-22, 17));
• Supplier System.out.println(maxCeros.apply(30450, 10700));
}
}

11
2. Expresiones lambda
con objetos

12
Ordenamiento. Ejemplo.
public static void main(String[] args) {
ArrayList<Project> projects = ProjectBuilder.getProjects();

System.out.println("Sorting by id (asc)");
projects.sort((p1, p2) -> p1.getId() - p2.getId());
showProjects(projects);

System.out.println("Sorting by budget (desc)");


projects.sort((p1, p2) -> Double.compare(p2.getBudget() - p1.getBudget(), 0.0));
showProjects(projects);
}

static void showProjects(ArrayList<Project> projects) {


for(Project project : projects) {
System.out.println(project);
}
}
13
Filtrado. Ejemplo.
public static void main(String[] args) {
ArrayList<Project> projects = ProjectBuilder.getProjects();

System.out.println("Projects with budget > 3000");


ArrayList<Project> projectsAbove3K =
new ArrayList<>(projects.stream().filter(p -> p.getBudget() > 3000).toList());
showProjects(projectsAbove3K);

try {
Date limitDate = new SimpleDateFormat("dd/MM/yyyy").parse("31/03/2023");
Predicate<Project> deliveryUntilMar2023 = p -> p.getDeliveryDate().before(limitDate);

ArrayList<Project> projectsUntilMar2023 =
new ArrayList<>(projects.stream().filter(deliveryUntilMar2023).toList());

System.out.println("Projects until Mar 2023");


showProjects(projectsUntilMar2023);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}

static void showProjects(ArrayList<Project> projects) {


for(Project project : projects) {
System.out.println(project);
}
}
14
5. Práctica

15
Ejercicio

Usando la clase Project, escribir el código necesario para:


• Mostrar en orden alfabético los nombres de los proyectos que
tengan un presupuesto menor a 5000 soles.
• Mostrar los nombres y presupuestos de los proyectos con
presupuesto mayor a 3000 soles. Ordenar los datos por
presupuesto en forma descendente.
• Calcular el total de dinero asignado a proyectos que serán
entregados en enero de 2023.

16
Cierre. Repaso y
resumen

• Expresión lambda.
• Referencia a método.
• Expresiones lambda con objetos.

17
6. Tarea

18
Tarea grupal
Implementar 03 programas en Java que
Indicaciones
hagan uso de expresiones lambda en
• Grupos: 3 integrantes (máximo)
cualquiera de las modalidades vistas en la • Entregables: a). Video de 3
minutos (máximo) explicando las
sesión. soluciones propuestas; b).
Archivo ZIP conteniendo el
Cada aplicación utilizará una técnica distinta Proyecto java con las soluciones.
• Todos los integrantes deben
en el uso de expresiones lambda. aparecer en el video explicando
los ejercicios.

Recuerda revisar en la
plataforma la rúbrica de la
tarea grupal.

Imagen obtenida de: https://upload.wikimedia.org/wikipedia/commons/0/0a/AnantP%40java.png 19

También podría gustarte