Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Juan Gutiérrez
Programación
GIT
Universitat de València
1 Objetivos
2 Tipos parametrizados
5 Expresiones lambda
6 Introducción a Streams
Índice
1 Objetivos
2 Tipos parametrizados
5 Expresiones lambda
6 Introducción a Streams
Objetivos
Índice
1 Objetivos
2 Tipos parametrizados
5 Expresiones lambda
6 Introducción a Streams
Motivación
Motivación
c.setElement(s);
Object o = c.getElement();
Motivación
Pero:
En este código vemos que se ha creado una instancia del tipo Contenedor
y el parámetro del tipo es de tipo String.
Por tanto para esta instancia <E> se sustituye por String.
Ventajas
Índice
1 Objetivos
2 Tipos parametrizados
5 Expresiones lambda
6 Introducción a Streams
Motivación
public E getMenor(){
return datos[0];
}
...
}
Aproximación 1: uso
Las clases cuyas instancias vamos almacenar en este contenedor deben
implementar a la interfaz.
Ejemplo 1:
class Empleado implements EsComparable{
//...
public int compara(EsComparable c){
//Comparación de este empleado con el que pasan
//Hay que hacer un cast de EsComparable a Empleado
Empleado e = (Empleado)c;
//...
}
}
Ejemplo 2:
class Figura implements EsComparable{
//...
public int compara(EsComparable c){
//Comparación de esta figura con la que pasan
//Hay que hacer un cast de EsComparable a Figura
Figura f = (Figura)c;
//...
}
}
Ejemplo 1:
class Empleado implements EsComparable<Empleado>{
//...
public int compara(Empleado e){
//Comparación de este empleado con el que pasan
}
}
Ejemplo 2:
class Figura implements EsComparable<Figura>{
//...
public int compara(Figura e){
//Comparación de esta figura con la que pasan
}
}
Índice
1 Objetivos
2 Tipos parametrizados
5 Expresiones lambda
6 Introducción a Streams
Collections Framework
El Collections Framework es una biblioteca de tipos que define
contenedores de datos y algoritmos (ordenación y búsqueda).
Esta biblioteca de tipos está organizada del siguiente modo:
Interfaces
Implementan
Clases Abstractas
Extienden
Clases
Collection<E> Define los métodos que deben tener todas las clases
(es la interfaz base)
Iterator<E> Las colecciones ofrecen un método para obtener un
iterador. El iterador permite recorrer los elementos de la colección.
Set<E> extends Collection<E> Representa a un conjunto (no
puede haber elementos repetidos).
Índice
Iterator<T> it = col.iterator();
T dato;
while (it.hasNext()){
dato = it.next();
// Procesar el dato
}
Ejemplo:
ArrayList<Figura> figs = new ArrayList<Figura>();
// Insertar figuras en el ArrayList
Iterator<Figura> it = figs.iterator();
Figura f;
while (it.hasNext()){
f = it.next();
// Hacer algo con la figura
}
Cualquier objeto que sea una colección se puede recorrer mediante un bucle
for del siguiente modo (también se puede usar con arrays):
Collection<T> col = ....;
Ejemplo:
TreeSet<String> palabras = new TreeSet<String>();
// Insertar cadenas en el TreeSet
Índice
1 Objetivos
2 Tipos parametrizados
5 Expresiones lambda
6 Introducción a Streams
Interfaces funcionales
y la clase
public class Contenedor<T>{
public List<T> cumplenCondicion(Predicate<T> p){
// Devuelve una lista con el subconjunto de los elementos que cumplen
// una condición.
// La condición viene encapsulada en el objeto del tipo Predicate
// que nos pasan como argumento
}
}
Interfaces funcionales
El método cumplenCondicion indica que hay que pasar una instancia que
podamos referenciar mediante una referencia del tipo Predicate.
Tenemos dos opciones:
Declarar una clase que implemente a la interfaz Predicate y pasar
una instancia al constructor
class P implements Predicate<String>{
public boolean test(String s){
return s.contains("the");
}
}
Contenedor<String> c = ...;
List<String> lista = c.cumplenCondicion(new P());
Interfaces funcionales
Expresiones lambda
Expresiones lambda
Cuando en el cuerpo aparece una expresión, equivale a evaluar la expresión
y devolver el resultado.
Cuando en el cuerpo aparece un bloque de código ({...}) y el método
debe devolver un resultado entonces debe aparecer explícitamente la
sentencia return.
Ejemplos:
Expresiones lambda
donde:
public Function<T,R>{
// A partir de un objeto del tipo T devuelve un objeto del tipo R
R apply(T t);
}
public UnaryOperator<T>{
// Recibe algo del tipo T y devuelve algo del tipo T
T apply (T t);
}
class Prueba{
public static void main(String[] args){
Contenedor<Empleado> ce = new ...;
ce.cumplenPredicado( e -> e.getEdad()>60);
Índice
1 Objetivos
2 Tipos parametrizados
5 Expresiones lambda
6 Introducción a Streams
Motivación
Cuando tenemos una serie de elementos (que pueden estar almacenados en
una colección, en un fichero, etc) es habitual tener que realizar operaciones
sobre ellos:
Obtención de un Stream
Stream<T> Stream.of(T[])
IntStream IntStream.range(int ini,int fin) devuelve un
IntStream con datos enteros que van desde ini hasta fin en pasos
de 1.
Programación, Tema 1 - Parte 3 Programación 46/53
Introducción a Streams
Métodos de Stream<T>
Ejemplo I
// imports
class Empleado{
private String nombre;
private String departamento;
private int edad;
Ejemplo II
public int getEdad(){
return edad;
}
Ejemplo III
// Edad media
System.out.println("Edad media de los empleados:");
double suma = empleados.stream().mapToDouble((e) ->
,→ e.getEdad()).reduce(0, (acc,dato) -> acc+dato);
System.out.println(suma/empleados.size());
}
}