Contenido de certificación
Social
Buscar
Ofertas laborales
sábado
feb072015

Lambda: quick start

Que tal compañer@s. Dejo a continuación una primera aproximación sobre expresiones Lambda, con código comentado en ejemplos. Cualquier comentario o crítica es bienvenida (especialmente las incisivas)

package javahispano.lambdas;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.swing.JButton;

/**
 * Clase que utilizaremos en la parte de métodos de comparación con Lambda
 *
 * @author jaimecl
 *
 */
public class Persona {

    private String surName;

    public Persona(String surName) {
        super();
        this.surName = surName;
    }

    public String getSurName() {
        return surName;
    }

    public void setSurName(String surName) {
        this.surName = surName;
    }

    /* Método de impresión de valores */
    public void printName() {
        System.out.println("surName=" + surName + "]");
    }

    /* Método que creará una lista corta de personas, a modo de datos de ejemplo */
    private static List createShortList() {
        ArrayList lista = new ArrayList();
        lista.add(new Persona("Carmona"));
        lista.add(new Persona("Pérez"));
        return lista;

    }

    /**
     * Método principal
     *
     * @param args
     */
    public static void main(String args) {

        /*
         * Empezamos con clases anónimas: utilizadas en un sólo punto del código
         * No hay necesidad de tener que definir una clase única que sea
         * referenciada sólo una vez
         */
        JButton testButton = new JButton("Test Button");
        testButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                System.out.println("Click Detected by Anon Class");
            }
        });

        /*
         * Java8 define como interfaz funcional aquella clase que define un sólo
         * método. Las expresiones Lambda pueden ser aplicadas sobre dichas
         * interfaces La sintaxis es la siguiente argumento -> cuerpo. (int x,
         * int y) -> x + y
         *
         * () -> 42
         *
         * (String s) -> { System.out.println(s); }
         */

        /* A continuación, vemos cómo definir Lambda Runnable */

        /* Manera antigua, con una clase anónima */
        new Runnable() {
            @Override
            public void run() {
                System.out.println("JavaHispaneros, ¡manera anónima!");
            }
        }.run();

        // Con Lambda, la interfaz runnable tiene un sólo método, por lo tanto,
        // podemos redefinirlo de la siguiente manera.
        Runnable r2 = () -> System.out
                .println("JavaHispaneros, ¡esto es Lambda!");

        /* A continuación, vemos un ejemplo de ordenación de listas */
        List personList = Persona.createShortList();

        /*
         * Ordenación con clases anónimas. Dentro del método sort, que espera
         * una interfaz de tipo Comparator, hacemos una redefinición
         */

        Collections.sort(personList, new Comparator() {
            public int compare(Persona p1, Persona p2) {
                return p1.getSurName().compareTo(p2.getSurName());
            }
        });

        // Ordenación ascendente, en este caso, haciendo uso de expresiones
        // lambda

        /*
         * El método sort de Collections espera un único método, con dos
         * parámetros. Por lo tanto, utilizamos la sintaxis lambda para definir
         * el método de comparación
         */
        Collections.sort(personList, (Persona p1, Persona p2) -> p1
                .getSurName().compareTo(p2.getSurName()));

        // Mismo caso, ejerciendo la ordenación descendente.
        Collections.sort(personList,
                (p1, p2) -> p2.getSurName().compareTo(p1.getSurName()));

        /* Otro caso para listeners */
        JButton botonMetodoAnonimo = new JButton("Botón con método anónimo");
        botonMetodoAnonimo.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                System.out.println("Click detectado por clase anónima");
            }
        });

        /*
         * De nuevo, vemos que addActionListener acepta una clase que implemente
         * la interfaz listener, que define un método único, por lo tanto,
         * acepta expresiones lambda Recordamos la sintaxis: nombre de variable
         * en parámetro -> acción a realizar Choca ver que en la parte de
         * parámetros no existe el tipo de parámetro que es
         */

        JButton botonMetodoLambda = new JButton("Botón con método lambda");
        botonMetodoLambda.addActionListener(e -> System.out
                .println("Click Detected by Lambda Listner"));

    }

}
lunes
jul142014

Duda sobre ArrayList y Vector.

Duda sobre ArrayList y Vector.

Buenos dís. Pensaba que tanto Vector como ArrayList se diferenciaban en que sus métodos eran (o no eran) thread-safe. Salió el debate en mi trabajo, y quise comprobarlo por mi mismo. Desarrollé el siguiente código. ¿Alguien puede indicarme la salida del mismo e intentar explicar la diferencia real, en un ejemplo práctico, entre Vector y ArrayList? Muchas gracias

import java.util.ArrayList;
import java.util.List;

public class Principal implements Runnable {

	private List lista = new ArrayList();
	private static List hilos = new ArrayList();

	private int i = 0;

	private final int MAX_VAL = 1000;
	private final static int MAX_VAL_STATIC = 1000;
	private final static int MAX_HILOS = 1000;
	private final static int TIEMPO_ESPERA_MS = 1000;

	public Principal(List lista) {
		this.lista = lista;

	}

	public static void main(String[] args) throws InterruptedException {

		Long inicio = System.currentTimeMillis();
		
		List lista = new ArrayList();

		System.out.println("Iniciando hilos....");
		for (int i = 0; i < MAX_HILOS; i++) {
			Principal p = new Principal(lista);
			hilos.add(p);
		}

		System.out.println("OK");

		System.out.println("Ejecutando hilos....");
		for (Principal hilo : hilos) {
			hilo.run();
		}
		System.out.println("OK");

		System.out.println("Esperando finalización");

		boolean finalizado = true;
		do {
			Thread.sleep(TIEMPO_ESPERA_MS);

			for (Principal hilo : hilos) {
				if (hilo.i < MAX_VAL_STATIC) {
					finalizado = false;
				}
			}

		} while (!finalizado);

		System.out.println("OK");

		System.out.println("EL TAMAÑO DE LA LISTA ES: " + lista.size());
		Long total = System.currentTimeMillis() - inicio;
	}

	public int getI() {
		return i;
	}

	public void setI(int i) {
		this.i = i;
	}

	@Override
	public void run() {
		while (i < MAX_VAL) {
			lista.add("" + i);
			i++;
		}
	}

}

lunes
abr282014

Date-Time API (JAVA 8)

Java 8 presenta un cambio profundo con respecto al manejo de fechas, aquí dejamos unos ejercicios para medir el nivel de los que estén interesados.

DATE-TIME API

PREGUNTAS

1) ¿Qué clase utilizarías para almacenar tu cumpleaños en años, meses, días, segundos y nanosegundos?

2) Dada una fecha aleatoria, ¿cómo obtendrías el jueves pasado?

3) ¿Qué diferencia existe entre ZoneId y ZoneOffset?

4) ¿Cómo convertirías Instant a ZonedDateTime? ¿Cómo convertirías ZonedDateTime a Instant?

EJERCICIOS

1) Escribe un programa que, para un año dado, reporta el nº de días de cada mes dentro del año.

2) Escribe un programa que, para un mes del año actual, lista todos los lunes del mes.

3) Escribe un ejemplo que chequea si una fecha se corresponde a viernes 13.

lunes
abr072014

Más sobre GregorianCalendar....

¿Cuál es la siguiente salida y por qué?

Aclaraciones: se dispone de un equipo bastante potente a la hora de ejecución, y el día de ejecución es: 7 de Abril de 2014

NOTA: no vale hacer uso de IDE.
package es.orange.gateway.tools;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Pruebas {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		GregorianCalendar gc1 = new GregorianCalendar();

		gc1.set(Calendar.MONTH, 4);

		try {
			Thread.sleep(10);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		GregorianCalendar gc2 = new GregorianCalendar();

		gc2.set(Calendar.MONTH, 4);

		System.out.println(gc2.compareTo(gc1));
		
		GregorianCalendar gc3 = new GregorianCalendar();

		gc3.set(Calendar.MONTH, 4);
		
		GregorianCalendar gc4 = new GregorianCalendar();

		gc4.set(Calendar.MONTH, 4);

		System.out.println(gc4.compareTo(gc3));
		
		GregorianCalendar gc5 = new GregorianCalendar();

		gc3.set(Calendar.MONTH, 4);
		
		GregorianCalendar gc6 = new GregorianCalendar();

		gc6.set(Calendar.MONTH, 16);

		System.out.println(gc5.compareTo(gc6));

		System.out.println(new SimpleDateFormat("dd/MM/yyyy").format(gc6.getTime()));

	}

}


jueves
abr032014

Pregunta sobre Java

¿Cuál es la salida por consola, y cuál la escrita en el fichero, de ejecutar el siguiente código fuente?

NOTA: tiene más gracia contestar sin hacer uso de IDE que haciendo uso de IDE


package pruebas;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
 *
 * @author Jaime Carmona Loeches
 *
 */
public class Escritor implements Runnable {
private String nombreFichero = "";
@Override
public void run() {
System.out.println("Escritor ejecutando");
ejecutaLogica(0);
}
public Escritor(String nombreFichero) {
System.out.println("Escritor inicializado");
this.nombreFichero = nombreFichero;
}
private synchronized void ejecutaLogica(int numEjecucion) {
System.out.println(numEjecucion);
FileWriter fw = null;
BufferedWriter bw = null;
try {
File file = new File(nombreFichero);
fw = new FileWriter(file);
bw = new BufferedWriter(fw);
for (int i = 0; i < 10; i++) {
String texto = numEjecucion + ":" + i;
bw.write(texto + "\n");
}
cierraRecursos(fw, bw);
numEjecucion++;
if (numEjecucion < 2)
ejecutaLogica(numEjecucion);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
}
}
private void cierraRecursos(FileWriter fw, BufferedWriter bw) {
try {
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) {
String nombreFichero = "out.txt";
Escritor escritor = new Escritor(nombreFichero);
escritor.run();
}
}

miércoles
abr022014

GregorianCalendar en Java

¿Cuál es la salida del siguiente programa y por qué? NOTA: no vale hacer uso de IDE.
package test;

import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * Probando Gregorian Calendar
 * 
 * @author Jaime Carmona Loeches
 * 
 */
public class Pruebas {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		GregorianCalendar gc1 = new GregorianCalendar();
		gc1.set(Calendar.MONTH, 4);
		GregorianCalendar gc2 = new GregorianCalendar();
		gc2.set(Calendar.MONTH, 12);
		
		System.out.println(gc2.compareTo(gc1));		
	}

}

miércoles
abr022014

Pregunta sobre referencias

¿Cuál es la salida del siguiente programa y por qué? NOTA: no vale hacer uso de IDE.

package test;

import java.util.ArrayList;
import java.util.List;

/**
 * Probando referencias en objetos y en string's
 * 
 * @author Jaime Carmona Loeches
 * 
 */
public class Pruebas {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List lista1 = new ArrayList();
		lista1.add(new Objeto(1, 1));

		List lista2 = new ArrayList();
		lista2.add("1");

		for (Objeto objeto : lista1) {
			objeto.setA(2);
			objeto.setB(2);
		}

		for (String objeto : lista2) {
			objeto = "2";
		}

		for (Objeto objeto : lista1) {
			System.out.println(objeto.toString());
		}

		for (String objeto : lista2) {
			System.out.println(objeto.toString());
		}
	}

}

class Objeto {
	int a = 0;
	int b = 0;

	public Objeto(int a, int b) {
		super();
		this.a = a;
		this.b = b;
	}

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}

	@Override
	public String toString() {
		return "Objeto [a=" + a + ", b=" + b + "]";
	}

}

jueves
mar272014

Preguntas sobre fechas

Buenos días.

Se plantean las siguientes preguntas, acerca gestión de fechas en Java.

1) Primera pregunta teórica, ¿qué diferencia existe entre las fechas de Java 6 y las últimas versiones de Java?

2) Pregunta práctica: ¿cómo determinar si una cadena, pasada como parámetro, se corresponde a una fecha correcta?

3) Segunda pregunta práctica: ¿cómo poder obtener el último día de un mes determinado?

Un saludo,

 

jueves
may302013

¿Cuál es la salida del siguiente programa y por qué?

 

public class Pruebas {
/**
* @param args
*/
public static void main(String[] args) {
  boolean a = true;
  boolean b = true;
  __main:
{
  if (a == true) {
  System.out.println("dentro del main: a es verdadero");
  System.out.println("ejecutamos break __main");
  break __main;
  } else {
  System.out.println("dentro del main: a es falso");
  }
  if (b == true) {
System.out.println("dentro del main: b es verdadero");
} else {
System.out.println("dentro del main: b es falso");
}
}
System.out.println("fuera del bloque __main");
} // end main
}

 

 

lunes
may062013

Pregunta sobre excepciones

Tenemos dos códigos: se pide en cada uno de ellos, decir si compila, y en tal caso, comentar la salida en tiempo de ejecución (lo más detallada posible).
CÓDIGO 1
package scjp;
public class Pregunta {
private int a = 0;
private int b = 10;
private int c = b / a;
public Pregunta() {
System.out.println("Hola JavaHispaneros "+c);
}
public static void main(String args[]) {
Pregunta p = new Pregunta();
}
}

package scjp;
public class Pregunta {
private int a = 0; private int b = 10; private int c = b / a;
public Pregunta() { System.out.println("Hola JavaHispaneros "+c); }
public static void main(String args[]) { Pregunta p = new Pregunta();
}}

 

CÓDIGO 2

package scjp;

 

public class Pregunta {

 

private D d = new D();

 

public Pregunta() {

System.out.println("Por aquí estamos otra vez " + d);

}

 

public static void main(String args[]) {

Pregunta p = new Pregunta();

 

}

 

class D {

 

D() throws PersonalException {

throw new PersonalException();

}

 

}

 

class PersonalException extends Exception {

 

}

}