Tema 5 Java 8. Programación Orientada a Objetos Curso 2016/2017

Documentos relacionados
INTERFACE COMPARATOR. DIFERENCIAS ENTRE COMPARATOR Y COMPARABLE. CLASE COLLECTIONS. EJERCICIOS RESUELTOS. (CU00918C)

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Principios de Computadoras II

- Compilar y ejecutar programas en Java - Estructura básica de una clase - El comando javac - El comando java - Introducción al IDE de desarrollo

Conceptos a tratar. Fundamentos de la Programación Orientada a Objetos Ampliación sobre clases y objetos

Ordenación de colecciones de objetos.

FUNDAMENTOS DE INFORMÁTICA

Diseño Basado en Componentes. Curso 2008 / 09

Modulo 11. Clases y Objetos en Java

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Tema 7: Polimorfismo. Índice

EL PAQUETE JAVA.UTIL DEL API JAVA. PRINCIPALES INTERFACES Y CLASES: STRINGTOKENIZER, DATE, CALENDAR, HASHSET, TREEMAP, TREESET...

INTRODUCCIÓN...9 CAPÍTULO 1. ELEMENTOS DE UN PROGRAMA INFORMÁTICO...11

FUNDAMENTOS DE PROGRAMACIÓN Curso: 2013/14 EXAMEN PARA ALUMNOS PRESENTADOS AL PRIMER PARCIAL PRIMERA PARTE. EJERCICIO 1 Cuestiones (1 punto)

Universidad de Managua

Java Avanzado Facultad de Ingeniería. Escuela de computación.

Desarrollo de aplicaciones con JAVA, JCreator, JDeveloper NetBeans

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Derechos de Acceso: COMPOSICION

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

PROGRAMACION ORIENTADA A OBJETOS EN C++

Java para programadores

Métodos que devuelven valor Dado el siguiente triángulo rectángulo:

Manual de turbo pascal

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

Interfaces y Clases Internas. ELO329: Diseño y Programación Orientados a Objetos

Lenguaje de programación con JAVA

1. Cuántas sentencias hay en la secuencia principal del siguiente programa?

Las plantillas permiten definir funciones genéricas.

Aplicaciones de Escritorio

Lección 2: Creando una Aplicación en Java. 1. Estructura del archivo de una clase. 3. Definiendo clases fundamentos

TEMA 2 Introducción a C# ANÁLISIS Y DESARROLLO DE APLICACIONES INFORMÁTICAS Curso 2010/2011

PARA QUÉ SIRVEN LAS INTERFACES JAVA. IMPLEMENTAR UNA INTERFAZ DEL API. VENTAJAS. EJEMPLOS BÁSICOS. (CU00697B)

2.2 Nombres, Ligado y Ámbito

C.I.F.: B Inscrita en el Registro Mercantil de Madrid, Tomo Libro 0, Folio 135, Sección 8. Hoja M Inscripción 1ª

QUÉ ES UNA CLASE JAVA? ATRIBUTOS (PROPIEDADES O CAMPOS), CONSTRUCTOR Y MÉTODOS. (CU00623B)

PROGRAMACIÓN ORIENTADA A OBJETOS CON JAVA

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

5. Sentencias selectivas o condicionales

Tutorial de C# Delegados y Eventos. Por: Óscar López, M.Sc.

Tema 4 Genericidad en Java. Programación Orientada a Objetos Curso 2013/2014

Conceptos más avanzados de Programación Orientada a Objetos

UNIVERSIDAD AUTÓNOMA DE CHIAPAS LICENCIATURA EN SISTEMAS COMPUTACIONALES

Tema 7.- Fundamentos de la Programación Orientada a Objetos

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

MASTER PROFESIONAL C# 5 Y ASP.NET MVC 5

Introducción a Java (II) Dr. (c) Noé Alejandro Castro Sánchez

LA ESTRUCTURA DE DATOS PILA EN JAVA. CLASE STACK DEL API JAVA. EJEMPLO Y EJERCICIOS RESUELTOS. (CU00923C)

Tema 3: Genericidad en Java. Tema 3: Genericidad en Java. Objetivos y Bibliografía. Modelos de Datos Genéricos

Clase adicional 2. Estructuras básicas de control. Temas

Variables. Una variable no es más que un nombre simbólico que identifica una dirección de memoria: vs.

ESCUELA DE INFORMÁTICA

Programación estructurada (Introducción a lenguaje C)

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Programación Orientada a Objetos con Java

Computación II. Introducción a Visual Basic

Unidad II. Fundamentos de programación en Java. Ing. José Luis Llamas Cárdenas

I. Introducción a la programación orientada a objetos y al lenguaje JAVA Colegio Reuven Feuerstein --Javier Navarro

20483 Programación en C#

Un identificador le da nombre único a un elemento en un programa (Variables, procedimientos, etc.). No puede contener operadores como + - * /

Estructuras de Datos Declaraciones Tipos de Datos

Tema 2 Introducción a la Programación en C.

DESCRIPCIÓN ESPECÍFICA NÚCLEO: COMERCIO Y SERVICIOS SUBSECTOR: INFORMÁTICA

INTRODUCCIóN A LA PROGRAMACIóN APUNTES DE JAVA APUNTES DE JAVA

Funciones como Subprogramas en C++

Operadores y Expresiones

Programación Orientada a Objetos con Java. Elementos Básicos del Lenguaje Java. Creación de un objeto. Creación de un objeto. Creación de un objeto

PROGRAMACIÓN EN C#.NET Programación Orientada a Objetos en C# Ing. Bruno López Takeyas

Práctica 4: Herencia. Objetivos:

Guía práctica de estudio 04: Clases y objetos

Ejercicio 1. Ejercicio 2

Clases en Java. Declaración de clases en Java 02/09/16. Ing. Roberto Martínez Román - public class Alumno { private int matricula;

Programación Orientada a Objetos con Java. Elementos Básicos del Lenguaje Java. Relación entre clases. Ejemplo de Clase: Punto !

Curso de Java POO: Programación orientada a objetos

Java Avanzado. Guía 1. Java Avanzado Facultad de Ingeniería. Escuela de computación.

Conversión entre Tipos

Java para no Programadores

Patrones de diseño. Patrón básico Handler. Técnicas de Programación - Curso 2008/09 (Esther Guerra Sánchez)

Programación orientada a objetos. Resumen de Temas Unidad 4: Sobrecarga

Programación orientada a objetos. Capítulo 8 Mejora de las estructuras mediante herencia

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Tema: Introducción al IDE de Microsoft Visual C#.

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

10. Algunas clases estándar de Java (I)

INDICE DEL CURSO APRENDER PROGRAMACIÓN JAVA DESDE CERO. PROGRAMACIÓN ORIENTADA A OBJETOS (CU00601B)

Clases y Objetos en Java. ELO329: Diseño y Programación Orientados a Objetos

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

INSTITUTO DE EDUCACIÓN SUPERIOR TECNOLÓGICO IBEROTEC SEMESTRE ACADÉMICO: 2014-II SÍLABO

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

PRÁCTICA No 4 POO Encapsulación. El alumno conocerá los principios de la encapsulación, y el uso de constructores para la inicialización de datos

Programación con Visual C#

Tema 4. Excepciones en Java

4. Operadores Operador asignación

Ejercicios de Programación Tema 7. Programación Orientada a Objetos

Transcripción:

Tema 5 Java 8 Programación Orientada a Objetos Curso 2016/2017

Contenido Motivación. Caso de estudio. Expresiones lamdba. Interfaces funcionales. Streams. Referencias a métodos y constructores. Nuevas características de las interfaces. Curso 2016/2017 Programación Orientada a Objetos 2

Motivación En la edad del bronce de la informática, un programador, ya jubilado, podía escribir este código en C: typedef int (*opbinaria)(int, int); int suma(int a, int b) { return a + b; } int multiplicacion(int a, int b) { return a * b; } void ejecuta(opbinaria f, int op1, int op2) { } int resultado = f(op1, op2); printf("%d\n", resultado); int main() { ejecuta(suma, 1, 2); ejecuta(multiplicacion, 1, 2); return 0; } Curso 2016/2017 Programación Orientada a Objetos 3

Motivación En 2013, el nieto de este programador, un experto programador certificado en Java, no podía escribir código en Java como el que escribía su abuelo En la Programación Orientada a Objetos, las variables sólo pueden contener datos. Así pues, no es posible declarar un método que acepte como parámetro una función. Los programadores han conseguido salvar esta limitación a través de patrones (recetas), como por ejemplo, el patrón estrategia. Java 8 resuelve esta limitación acercando la Programación Orientada a Objetos a la Programación Funcional. Curso 2016/2017 Programación Orientada a Objetos 4

Caso de estudio Ordenar una lista. La clase Collections ofrece el método static sort para ordenar listas: public static <T> void sort(list<t> lista, Comparator<T> comparador); El método sort es un ejemplo de aplicación del patrón estrategia. El método sort es un método genérico que acepta como primer parámetro una lista (interfaz java.util.list<t>) y como segundo parámetro un comparador (estrategia, interfaz java.util.comparator<t>). Curso 2016/2017 Programación Orientada a Objetos 5

Caso de estudio Tenemos una lista de objetos de la clase Usuario: Curso 2016/2017 Programación Orientada a Objetos 6

Caso de estudio La clase ComparadorUsuarios implementa un criterio de ordenación de usuarios por edad (de menor a mayor): class ComparadorUsuarios implements Comparator<Usuario> { @Override public int compare(usuario o1, Usuario o2) { } } return o1.getedad() - o2.getedad(); Patrón estrategia: esta clase está implementando una estrategia de comparación. Los objetos de esta clase son utilizados por el método sort para comparar objetos. Curso 2016/2017 Programación Orientada a Objetos 7

Caso de estudio Ordenamos una lista de usuarios (LinkedList<Usuario>) utilizando el criterio de ordenación anterior: Collections.sort(usuarios, new ComparadorUsuarios()); Observa que el método genérico se aplica correctamente: La colección es de tipo LinkedList<Usuario> compatible con List<Usuario>. El primer parámetro permite inferir que el tipo <T> es Usuario. El comparador es un objeto compatible con la interfaz Comparator<Usuario>. Curso 2016/2017 Programación Orientada a Objetos 8

Caso de estudio Problema: la necesidad de nuevos criterios de ordenación conlleva la proliferación de clases que implementen comparadores. Para evitar tener que declarar una clase que sólo va a ser utilizada en un punto del código, Java permite crear clases anómimas. Collections.sort(usuarios, new Comparator<Usuario>() { @Override public int compare(usuario o1, Usuario o2) { ); } } return o1.getnombre().compareto(o2.getnombre()); Curso 2016/2017 Programación Orientada a Objetos 9

Expresiones lambda Java 8 introduce el concepto de expresión lambda, también conocido como closure. Una expresión lambda es un bloque de código que representa a una función. El uso de una expresión lambda reduce la necesidad clases anónimas: Collections.sort(usuarios, (Usuario o1, Usuario o2) -> { ); } return o2.getnombre().compare(o1.getnombre()); Curso 2016/2017 Programación Orientada a Objetos 10

Expresiones lambda La sintaxis de una expresión lambda se puede simplificar cuando se conocen los tipos de los parámetros y el bloque de código es una sola sentencia: Collections.sort(usuarios, (o1, o2) -> o2.getedad() - o1.getedad()); El compilador conoce que el segundo parámetro es de tipo Comparator<Usuario> y contiene un solo método con la siguiente signatura: int compare(usuario o1, Usuario o2); El tipo T se infiere del tipo de la lista (Usuario). Por tanto, no es necesario indicar el tipo de los parámetros. La segunda parte de la expresión es un valor entero, el tipo de retorno del método compare. Curso 2016/2017 Programación Orientada a Objetos 11

Expresiones lambda Las expresiones lambda tienen acceso a las variables y atributos del contexto del código: Variables locales y parámetros, siempre que éstos no sean modificados después de la declaración de la expresión lambda. Acceso a atributos, que sean visibles, sin restricción. Ejemplo: Hace uso de un método filtro previamente declarado. public static void seleccionporrangoedad(list<usuario> lista, int edadinicio, int edadfin) { } filtro(lista, u -> u.getedad() >= edadinicio && u.getedad() < edadfin); Curso 2016/2017 Programación Orientada a Objetos 12

Interfaces funcionales Las expresiones lambda son bloques de código (funciones) compatibles con interfaces funcionales. Una interfaz funcional es aquella que contiene un solo método abstracto. La interfaz Comparator<T> es una interfaz funcional: @FunctionalInterface interface Comparator<T> { } int compare(t o1, T o2); La anotación @FuntionalInterface es opcional. Indica al compilador el propósito de la interfaz. Curso 2016/2017 Programación Orientada a Objetos 13

Interfaces funcionales La librería de Java incluye varias interfaces funcionales de utilidad en el paquete java.util.function. Interfaz Predicate<T>: interface Predicate<T> { } boolean test(t obj); Representa funciones que evalúan un objeto retornando un valor booleano. Son útiles para filtrar elementos. Curso 2016/2017 Programación Orientada a Objetos 14

Interfaces funcionales Interfaz Function<T, R>: interface Function<T, R> { } R apply(t obj); Representa las funciones que hacen corresponder un objeto de tipo T con otro de tipo R. Interfaz Supplier<T>: interface Supplier<T> { } T get(); Representa funciones de las que podemos obtener objetos. Curso 2016/2017 Programación Orientada a Objetos 15

Interfaces funcionales Interfaz Consumer<T>: interface Consumer<T> { } void accept(t obj); Representa procedimientos que realizan una acción con un objeto, sin retornar nada. Ejemplo: mostrarlo por la consola, almacenarlo en disco, etc. En general, las interfaces funcionales incluidas en la librería representan un abanico amplio de funciones (estrategias). Curso 2016/2017 Programación Orientada a Objetos 16

Streams Un stream es una secuencia de datos que son procesados en una aplicación (java.util.stream). Las colecciones de Java ofrecen streams de los objetos que contienen (método stream). Los streams soportan dos tipos de operaciones: Intermedias: filtran o transforman la secuencia de datos. Terminales: finalizan el procesamiento, retornando un valor o realizando una acción sobre los datos. Ejemplo: contar los usuarios cuyo nombre comienza por j long contador = usuarios.stream().filter(u -> u.getnombre().startswith("j")).count(); Curso 2016/2017 Programación Orientada a Objetos 17

Streams Método filter: Filtra los elementos de la secuencia. Acepta como parámetro un predicado (Predicate<T>) Retorna un stream con aquellos elementos que cumplen el predicado. Método sorted: Ordena la secuencia de datos según un criterio de ordenación. Acepta como parámetro un comparador (Comparator<T>). Retorna un stream con la secuencia ordenada. El método sorted tiene una versión sobrecargada sin parámetros que aplica el orden natural de los elementos. Curso 2016/2017 Programación Orientada a Objetos 18

Streams Método map: Retorna un stream resultado de la correspondencia de cada elemento de la secuencia original en otro dato. Acepta como parámetro una función (Function<T, R>) Método foreach: Operación terminal que aplica una acción sobre cada objeto de la secuencia. Acepta como parámetro un consumidor (Consumer<T>) Curso 2016/2017 Programación Orientada a Objetos 19

Streams Métodos anymatch, nomatch y allmatch: Operaciones terminales que retornan un booleano indicando si se cumple un predicado en algún (any), ningún (no) o todos (all) los objetos del stream. Acepta como parámetro un predicado (Predicate<T>) Método count: Operación terminal que retorna el número de objetos resultado del procesamiento de la secuencia. Curso 2016/2017 Programación Orientada a Objetos 20

Streams Ejemplos Muestra por la consola los nombres de los usuarios: usuarios.stream().map(u -> u.getnombre()).foreach(n -> System.out.println(n)); Obtiene una lista con los nombres de los usuarios: List<String> nombres = new LinkedList<String>(); usuarios.stream().map(u -> u.getnombre()).foreach(n -> nombres.add(n)); Curso 2016/2017 Programación Orientada a Objetos 21

Streams Ejemplos Muestra los nombres de los usuarios en orden alfabético: usuarios.stream().sorted((u1, u2) -> u1.getnombre().compareto(u2.getnombre())).map(u -> u.getnombre()).foreach(n -> System.out.println(n)); Igual que el anterior, ordenando el flujo con los nombres: La clase String implementa el orden natural (Comparable) usuarios.stream().map(u -> u.getnombre()).sorted().foreach(n -> System.out.println(n)); Curso 2016/2017 Programación Orientada a Objetos 22

Streams Ejemplos Consultar si la colección tiene algún usuario mayor de 20 años: boolean resultado = usuarios.stream().anymatch(u -> u.getedad() > 20); Obtener los nombres de los usuarios que empiecen por j : Set<String> resultado = new HashSet<String>(); usuarios.stream().filter(u -> u.getnombre().startswith("j")).map(u -> u.getnombre()).foreach(n -> resultado.add(n)); Curso 2016/2017 Programación Orientada a Objetos 23

Referencias a métodos Un tipo de datos que corresponda con una interfaz funcional puede aceptar como valor tanto una expresión lambda como una referencia a un método ya existente. Por tanto, donde sea aceptable una expresión lambda también es aceptable la referencia a un método. En las siguientes diapositivas se ilustra el uso de referencias a métodos en el procesamiento de colecciones basado en stream. No obstante, se pueden utilizar para dar valor a cualquier variable cuyo tipo sea una interfaz funcional. Curso 2016/2017 Programación Orientada a Objetos 24

Referencias a métodos static Ejemplo: referencia al método static parseint de la clase Integer, que convierte una cadena en un entero. List<String> lista = Arrays.asList("30", "10", "12", "8"); lista.stream().map(integer::parseint).map(entero -> entero + 1).forEach(entero -> System.out.println(entero)); Utilizamos :: para hacer referencia al nombre del método. La expresión lambda equivalente sería: s -> Integer.parseInt(s) Curso 2016/2017 Programación Orientada a Objetos 25

Referencias a métodos de instancia Ejemplo: obtiene los tamaños de una lista de cadenas. Utiliza el método de instancia length() de la clase String. lista.stream().map(string::length).foreach(longitud -> System.out.println(longitud)); Se hace referencia a un método de instancia igual que si fuera un método static. La expresión lambda equivalente sería: s -> s.length() Observa que, a diferencia del método static, s es el objeto receptor de la llamada y no el parámetro del método. Curso 2016/2017 Programación Orientada a Objetos 26

Referencias a métodos Ejemplo: referencia a un mensaje, al método indexof que permite obtener el índice en el comienza una cadena dentro de otra cadena. Un mensaje es la aplicación de un método sobre un objeto concreto. String frase = "hola, ahora estudiamos referencias a métodos"; List<String> lista = Arrays.asList("hola", "de", "método"); lista.stream().map(frase::indexof).foreach(indice -> System.out.println(indice)); // 0, -1, 37 La referencia al método equivale a la expresión lambda: s -> frase.indexof(s) Curso 2016/2017 Programación Orientada a Objetos 27

Referencias a métodos Ejemplo: otro ejemplo de referencia a un mensaje que utiliza el método println de la consola. List<String> lista = Arrays.asList("hola", "hello", "hallo"); lista.stream().sorted().foreach(system.out::println); La referencia al método equivale a la expresión lambda: s -> System.out.println(s) Curso 2016/2017 Programación Orientada a Objetos 28

Referencias a constructores Los constructores son considerados como funciones que retornan un objeto del tipo de la clase. Por tanto, se pueden utilizar como referencias a métodos utilizando el identificador new Ejemplo: construir fechas a partir de marcas de tiempo // Marcas de tiempo, milisegundos desde 1/1/1970 List<Long> lista = Arrays.asList(1480440505377l, 1480440500000l, 1380440505377l); lista.stream().map(date::new) // equivale a: map(marca -> new Date(marca)).forEach(System.out::println); En el ejemplo, se utiliza el constructor de java.util.date que construye una fecha estableciendo como parámetro una marca de tiempo (long). Curso 2016/2017 Programación Orientada a Objetos 29

Referencias a métodos Al establecer la referencia a un método o constructor no se identifican los parámetros. Sin embargo, Java permite sobrecarga de métodos. En caso de que una operación esté sobrecargada, se elegirá la definición que se ajuste a la interfaz funcional del tipo de la variable. En el ejemplo anterior: Date tiene varios constructores. Dado que map espera una función que acepte un long y retorne un Date, se toma el constructor que tiene como parámetro long. El método println tiene varias versiones sobrecargadas, una para cada tipo primitivo y otra para Object. En este caso utiliza la de Object, ya que Date es compatible con Object. Curso 2016/2017 Programación Orientada a Objetos 30

Interfaces Qué consecuencias tiene romper la especificación de una interfaz en Java? Ejemplo: introducir un nuevo método en la interfaz Comparator o en la interfaz Collection. Las interfaces suponen un importante problema de mantenimiento para el código Java: Añadir un nuevo método a una interfaz implica que todas las clases que previamente hayan implementado la interfaz ya no compilan. Los cambios en Java 8 han motivado la aparición de métodos de extensión en interfaces. Curso 2016/2017 Programación Orientada a Objetos 31

Interfaces métodos por defecto Un método de extensión o método por defecto es un método implementado en una interfaz. Una clase que implemente una interfaz con un método por defecto tiene dos opciones: 1) aceptar la implementación que ofrece la interfaz o 2) proporcionar otra implementación. Gracias a los métodos por defecto, ya no resulta problemático añadir operaciones a la interfaz: Curso 2016/2017 Programación Orientada a Objetos 32

Interfaces métodos por defecto Ejemplo: Supuesto: queremos añadir el método skip en la interfaz java.util.iterator<t> default void skip() { } if (hasnext()) next(); En el ejemplo anterior, el método skip sería equivalente a un método plantilla de una clase abstracta: un método implementado que se apoya en métodos abstractos. En general, un método por defecto puede contener cualquier código. No tiene la obligación de usar métodos de la interfaz. Curso 2016/2017 Programación Orientada a Objetos 33

Interfaces métodos por defecto La introducción de métodos por defecto en las interfaces ha enriquecido la funcionalidad de las colecciones en Java 8. Ejemplo: nuevos métodos en los mapas HashMap<String, Integer> mapa = new HashMap<String, Integer>(); mapa.putifabsent("juan", 10); int valor = mapa.getordefault("pedro", 0); El método putifabsent realiza la inserción si la clave no está previamente registrada en el mapa. El método getordefault retorna un valor por defecto en el caso de no existir la clave en el mapa. Curso 2016/2017 Programación Orientada a Objetos 34

Interfaces métodos static Dado que hasta Java 7 las interfaces no podían tener código, se han desarrollado clases de utilidad para completar la funcionalidad que ofrecen las interfaces. Ejemplo: colecciones de Java y clase Collections. La clase Collections ofrece métodos static con funcionalidad para las colecciones como ordenar listas, ofrecer vistas no modificables, etc. En Java 8 es posible implementar métodos static en las interfaces. De este modo, ya no es necesario introducir clases con funcionalidad complementaria como Collections. Curso 2016/2017 Programación Orientada a Objetos 35