<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>java8 &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<atom:link href="https://www.oscarblancarteblog.com/tag/java8/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.oscarblancarteblog.com</link>
	<description>Software Architect &#38; FullStack developer</description>
	<lastBuildDate>Sun, 02 Aug 2020 22:43:57 +0000</lastBuildDate>
	<language>es-MX</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.12</generator>

<image>
	<url>https://www.oscarblancarteblog.com/wp-content/uploads/2019/03/cropped-ob-32x32.png</url>
	<title>java8 &#8211; Oscar Blancarte &#8211; Software Architecture</title>
	<link>https://www.oscarblancarteblog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">89905023</site>	<item>
		<title>Java 8 – Streams</title>
		<link>https://www.oscarblancarteblog.com/2017/03/16/java-8-streams-2/</link>
					<comments>https://www.oscarblancarteblog.com/2017/03/16/java-8-streams-2/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 16 Mar 2017 09:00:25 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java8]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1574</guid>

					<description><![CDATA[<p>Los Streams son una secuencia de elementos que soportan operaciones de agregación secuencial y paralela. Una de las nuevas características de Java 8 que permite manipular las colecciones como nunca, casi parecido a un sueño. Como programador seguramente has trabajado con una infinidad de colecciones, seguramente te ha tocado recorrerlas, ordenarlas, dividirlas, filtrarlas, eliminar o [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/03/16/java-8-streams-2/">Java 8 – Streams</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="aligncenter size-full wp-image-1575" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/03/java-8-Streams.png" alt="java 8 - Streams" width="929" height="524" />Los Streams son una secuencia de elementos que soportan operaciones de agregación secuencial y paralela. Una de las nuevas características de Java 8 que permite manipular las colecciones como nunca, casi parecido a un sueño.<span id="more-1574"></span></p>
<p>Como programador seguramente has trabajado con una infinidad de colecciones, seguramente te ha tocado recorrerlas, ordenarlas, dividirlas, filtrarlas, eliminar o agregar nuevos elementos en la colección. Y cada vez que hacías esto estabas casi forzado a realizar un foreach sobre la colección, incluso, tenías que hacer un foreach anidado para poder realizar operaciones más complejas; prueba de ello es que el nombre <span class="lang:java decode:true crayon-inline ">ConcurrentModificationException</span>  te recuerda a algo (¿o no?).</p>
<p>Pues bien, los Streams no permite crear atajos a la hora de procesar colecciones, creando flujos de datos que permite el procesamiento de una forma declarativa, es decir, que nos centramos en lo que queremos resolver, y no en cómo debemos hacerlo, como pasa en la programación imperativa.</p>
<p><iframe class='youtube-player' width='648' height='365' src='https://www.youtube.com/embed/EsBXjODbmJM?version=3&#038;rel=1&#038;fs=1&#038;autohide=2&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' allowfullscreen='true' style='border:0;'></iframe></p>
<p style="text-align: center;">Sígueme en mi canal de Youtube</p>
<p style="text-align: center;">
<p>Pero dejémonos de palabrerías (que me sobran) y vallamos a un escenario concreto donde se puede aplicar para entender mejor. Veamos el caso más simple al utilizar una colección, imprimamos todos los valores de una lista ¿Simple no?</p>
<pre class="lang:java decode:true">public static void printForeach(){
  List&lt;String&gt; names = getStringArray();
  for (String name : names) {
     System.out.println(name);
  }
}</pre>
<p>Este código que está viendo, es un escenario normal que utilizarías para imprimir todos los elementos de una lista (apuesto que sí), ¿verdad que no tiene nada de extraño? La verdad es que no, porque ya estamos acostumbrados a hacerlo así, pero te apuesto que tu punto de vista acerca de este código cambiaría si ti dijera que puedo hacer el foreach en una solo línea de código. ¿no me crees? Pues tómala!!</p>
<pre class="lang:java decode:true ">public static void printStream(){
    List&lt;String&gt; names = getStringArray();
    names.stream().forEach(System.out::println);
}</pre>
<p>Probablemente te estés preguntado ¿qué clase de brujería es eso?, pero la realidad es que no hay tal brujería, simplemente estamos utilizando los Streams. Notemos que estamos utilizando el método <span class="lang:java decode:true crayon-inline ">stream()</span> para obtener el Stream, seguido, solo utilizamos el método <span class="lang:java decode:true crayon-inline ">forEach()</span> en el cual definimos mediante lo que vamos a hacer para cada elemento de la colección. En este caso estamos imprimiendo cada empleado utilizando <a href="https://www.oscarblancarteblog.com/2017/02/27/java-8-metodos-referenciados/">Referencia a métodos</a>.</p>
<p>Para comprender mejor que es un stream (espero no herir los sentimientos de algunos) lo voy a explicar de una forma simple fácil de digerir y que pueda que no cuadre con la definición perfecta, pero seguro me entenderás. Imagina que los streams son una forma de iterar todos los elementos de la colección de una forma simple, y que además mientras los iteras puedes realizar operaciones sobre la colección de forma declarativa. Es decir, vamos a realizar operaciones pero centrándonos en el objetivo que buscamos, no en cómo implementar el algoritmo para que funcione. Veamos otro ejemplo más complejo.</p>
<p>Imaginemos que tenemos una lista de Empleados, cada empleado tiene un ID que lo identifica como único, tiene un nombre y el departamento el que pertenece. La lista de empleados es la siguiente:</p>
<table  class=" table table-hover" >
<tbody>
<tr>
<td width="56">ID</td>
<td width="321">Name</td>
<td width="189">Department</td>
</tr>
<tr>
<td width="56">1</td>
<td width="321">Oscar Blancarte</td>
<td width="189">Systems</td>
</tr>
<tr>
<td width="56">2</td>
<td width="321">Liliana Castro</td>
<td width="189">Systems</td>
</tr>
<tr>
<td width="56">3</td>
<td width="321">Fernanda Martinez</td>
<td width="189">Systems</td>
</tr>
<tr>
<td width="56">4</td>
<td width="321">Manuel Lopez</td>
<td width="189">RH</td>
</tr>
<tr>
<td width="56">5</td>
<td width="321">Rebeca Perez</td>
<td width="189">Systems</td>
</tr>
<tr>
<td width="56">1</td>
<td width="321">Oscar Blancarte</td>
<td width="189">Systems</td>
</tr>
</tbody>
</table>
<p>Ahora bien, sobre esta lista queremos filtrar todos los Empleados que pertenecen al departamento de sistemas, luego vamos a ordenas todos los empleados de forma ascendente por su nombre, luego vamos a filtrar los elementos repetidos mediante su ID, finalmente, imprimiremos el nombre de todos los empleados que cumplieron con todas las reglas. Pfff!! ¿Imaginas hacer esto con una colección? A mí ya me empezó a doler la cabeza 🙁 . Por suerte, el enfoque declarativo de los Streams nos permite enfocarnos solamente en el <strong>que</strong> y no en el <strong>cómo</strong>. Veamos cómo quedaría la solución usando Streams.</p>
<pre class="lang:java decode:true ">public static void printOrderedSystemEmployees(){
    List&lt;Employee&gt; employess = getEmployeeArray();
    employess.stream()
            .filter(x -&gt; x.getDepartment().equals("Systems"))
            .sorted((x,y) -&gt; x.getName().compareToIgnoreCase(y.getName()))
            .distinct()
            .forEach(System.out::println);
}</pre>
<figure id="attachment_3207" aria-describedby="caption-attachment-3207" style="width: 800px" class="wp-caption aligncenter"><a href="https://codmind.com/courses/java-lambda"><img loading="lazy" class="wp-image-3207 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg" alt="Curso de Java Lambdas con Streams" width="800" height="450" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption id="caption-attachment-3207" class="wp-caption-text">Te invitamos a ver nuestro curso de Java Lambdas + Streams para aprender a programar con el nuevos paradigma funcional.</figcaption></figure>
<p>Ves lo fácil que es hacer todo esto con los Streams, solo nos preocupamos por lo que queremos hacer pero no por el cómo. Veamos los métodos del Stream utilizados, filter, nos permite filtrar elementos de la lista, para lo cual solo deberemos crear una expresión que regrese un boolean, si regresa true, entonces es agregado al Stream de resultados. Luego tenemos el método <span class="lang:java decode:true crayon-inline ">sorted()</span> en el cual definimos cual es mayor mediante la comparación de los nombres. Seguido, utilizamos el método <span class="lang:java decode:true crayon-inline ">distinct()</span> para filtrar los Empleados repetidos, para esto hemos sobreescrito el método equals para comprar por el ID en lugar del Hashcode. Finalmente un foreach para imprimir los resultados:</p>
<ul>
<li>Fernanda Martinez</li>
<li>Liliana Castro</li>
<li>Oscar Blancarte</li>
<li>Rebeca Perez</li>
</ul>
<p>¡Realmente sorprendente verdad!!, al menos para mí si… Pues bien, así como vimos algunos métodos interesantes de los Streams, debes de saber que la interface Stream proporciona varios métodos interesantes que te pueden ayudar muchísimo, sin embargo la intención de este artículo es introducirte en el concepto de los Stream y que logres entender que son y cómo se utilizan, por lo que si quieres aprender todavía más, poder ver este <a href="https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html">link</a>, donde explican a profundidad la interface Stream y todos los métodos que expone. Me gustaría explicarte a detalle cada uno de los métodos disponibles, pero en realidad creo que sería reinventar la rueda, pues en el link se explica mucho mejor de lo que yo mismo podría hacerlo.</p>
<p>El resultado se puede apreciar mejor con la siguiente imagen:</p>
<p><img loading="lazy" class="aligncenter wp-image-1583" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/03/Java-8-Streams.png" alt="Java 8 - Streams" width="1003" height="713" /></p>
<p>En fin, creo que si lograste entender que son los Streams yo me doy por bien servidor, pero si por algún motivo tienes alguna duda, puedes escribirme en la sección de comentarios y con gusto te contestaré.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/03/16/java-8-streams-2/">Java 8 – Streams</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/03/16/java-8-streams-2/feed/</wfw:commentRss>
			<slash:comments>10</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1574</post-id>	</item>
		<item>
		<title>Java 8 – Métodos referenciados</title>
		<link>https://www.oscarblancarteblog.com/2017/02/27/java-8-metodos-referenciados/</link>
					<comments>https://www.oscarblancarteblog.com/2017/02/27/java-8-metodos-referenciados/#respond</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Mon, 27 Feb 2017 09:00:06 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java8]]></category>
		<guid isPermaLink="false">https://www.oscarblancarteblog.com/?p=1439</guid>

					<description><![CDATA[<p>Los métodos referenciados son una de las nuevas características de Java 8 que nos permite hacer referencia a los métodos y constructores por medio de una interface funcional, dicho de otra manera, podemos implementar la funcionalidad de un método abstracto por medio de la implementación de un método ya implementado, asignando el método implementado al [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/02/27/java-8-metodos-referenciados/">Java 8 – Métodos referenciados</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="aligncenter wp-image-1548" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/Referencia-métodos.jpg" alt="métodos referenciados" width="768" height="431" />Los métodos referenciados son una de las nuevas características de Java 8 que nos permite hacer referencia a los métodos y constructores por medio de una <a href="https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/">interface funcional</a>, dicho de otra manera, podemos implementar la funcionalidad de un método abstracto por medio de la implementación de un método ya implementado, asignando el método implementado al método abstracto. Esto puede resultar un tanto extraño, sobre todo porque Java era, hasta la versión 8 un lenguaje demasiado estricto.<span id="more-1439"></span></p>
<p>La siguiente imagen muestra más claro cómo funciona la referencia a métodos:</p>
<p><img loading="lazy" class="aligncenter wp-image-1441" src="https://www.oscarblancarteblog.com/wp-content/uploads/2017/02/1-1.png" alt="Métodos referenciados" width="670" height="341" /></p>
<p>En la imagen podemos ver una <a href="https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/">interface funcional</a>, la cual define un método abstracto, por otro lado, tenemos una clase Custom, la cual define un método implementado, este método tiene un cuerpo y una funcionalidad previamente implementada. Sabemos que el método abstracto de la interface funcional no tiene implementada una funcionalidad, pues es una interface, y queremos que el método abstracto haga referencia al método de la clase Custom, por lo cual “asignamos” o referenciamos el método de la clase custom por medio del método de la interface funcional. Para que un método pueda ser referenciado debe de coincidir los parámetros y el retorno de la interface funcional con el del método que queremos referenciar, por lo tanto, el nombre del método no importaría.<br />
¿Pero cómo funciona esto?<br />
Cuando referenciamos un método, lo que pasa es que la funcionalidad del método original es implementada con una referencia al método referenciado, esto quieres decir que cuando ejecutemos el método de la interface funcional, en realidad lo que pasara es que se ejecutara el método de la otra clase.</p>
<h2>Tipos de métodos referenciados:</h2>
<p>• Referencia a un método estático<br />
• Referencia a un método de un objeto<br />
• Referencia a un método de un objeto arbitrario<br />
• Referencia a un constructor</p>
<p>Antes de explicarlos, me gustaría que vieras el código, trates de familiarizarte con las clases para después entrar en la explicación. El código completo lo puedes encontrar GitHub: <a href="https://github.com/oscarjb1/MethodReferences.git">https://github.com/oscarjb1/MethodReferences.git</a></p>
<p>La siguiente clase es un Interface Funcional debidamente anotada con <span class="lang:java decode:true crayon-inline">@FunctionalInterface</span> , Esta interface la cual utilizaremos como base para referenciar los métodos.</p>
<pre class="lang:java decode:true" title="Hello.java">package com.osb.referencedmethod;

/**
* @author Oscar Blancarte &lt;oscarblancarte3@gmail.com&gt;
*/
@FunctionalInterface
public interface IHello {
public void sayHello();
}</pre>
<p>La siguiente clase será utilizada para referencias a su constructor.</p>
<pre class="lang:java decode:true" title="Hello.java">package com.osb.referencedmethod;

/**
* @author Oscar Blancarte &lt;oscarblancarte3@gmail.com&gt;
*/
public class Hello implements IHello {

private String helloMessage;

public Hello() {
System.out.println("Hey!!! i'am a constructor");
}

public void createHello(String helloMessage) {
this.helloMessage = helloMessage;
}

@Override
public void sayHello() {
System.out.println(this.helloMessage);
}
}</pre>
<p>La siguiente clase tiene el contenido más importante de este artículo, en ella veremos los 4 tipos de referencias a métodos.</p>
<pre class="lang:java decode:true" title="Hello.java">package com.osb.referencedmethod;

import com.osb.referencedmethod.IHello;
import java.util.Arrays;

/**
* @author Oscar Blancarte &lt;oscarblancarte3@gmail.com&gt;
*/
public class Methods {
public static void sayStaticHello() {
System.out.println("Hey!!! i'am a static hello!");
}

public void sayInstanceHello() {
System.out.println("Hey!!! i'am a instance hello");
}

public static void main(String[] args) {
//Referencia a un método estatico
IHello staticRef = Methods::sayStaticHello;
staticRef.sayHello();

//Referencia a un método de un objeto
Methods methods = new Methods();
IHello instanceRef = methods::sayInstanceHello;
instanceRef.sayHello();

//Referencia a un método de un objeto arbitrario
String[] names = new String[]{"Oscar", "Alex", "Maria", "Samuel", "Perla", "Fausto"};
Arrays.sort(names, String::compareToIgnoreCase);
System.out.println("Hey!!! i'am a ordered array " + Arrays.toString(names));

//Referencia a un constructor
IHello hello = Hello::new;
hello.sayHello();
}
}</pre>
<p>Una vez, analizadas las clases pasaremos explicar, pero antes, me gustaría que vieras el resultado de la ejecución del proyecto:</p>
<pre class="">Hey!!! i'am a static hello!
Hey!!! i'am a instance hello
Hey!!! i'am a ordered array [Alex, Fausto, Maria, Oscar, Perla, Samuel]
Hey!!! i'am a constructor</pre>
<p>¡Impresionante no!!!, ¿esperabas este resultado? Si es así, entonces quieres decir que ya estas más familiarizado con Java 8 y las expresiones lambda, pero si no es así, no importa, porque a continuación explicaremos lo que está pasando. Para hacer esta explicación más simple, asumiremos que ya conocemos que son las interfaces funcionales, si no es así, aquí explico cómo. Pues bien, iniciaremos con las referencias a los métodos estáticos, para lo cual regresaremos a las líneas 20-21, observemos que estamos creando la variable <span class="lang:java decode:true crayon-inline">staticRef</span>, la cual es de tipo <span class="lang:java decode:true crayon-inline">IHello</span> (Recordemos que IHello es una interface funcional), pero al asignarle valor a la variable, no lo hacemos con un <span class="lang:java decode:true crayon-inline">new</span>, si no que indicamos que la interface funcional se debe implementar con el método <span class="lang:java decode:true crayon-inline">sayStaticHello</span> el cual está definido en la clase <span class="lang:java decode:true crayon-inline">Methods</span>, para hacer la referencia al método <span class="lang:java decode:true crayon-inline">sayStaticHello</span> de la clase <span class="lang:java decode:true crayon-inline">Methods</span>. Para hacer la referencia se utiliza <span class="lang:java decode:true crayon-inline">::</span> (Cuadro puntos o dos dobles punto). Al ejecutar el método en la línea 21, vemos que se imprime <em>“Hey!!! i&#8217;am a static hello!”</em>.<br />
La otra forma de implementar las referencias es por medio de los métodos a un objeto en particular como en las líneas 24-26, en la cual vemos que primero instanciamos la clase <span class="lang:java decode:true crayon-inline">Methods</span>, luego volvemos a utilizar <span class="lang:java decode:true crayon-inline">::</span> para hacer referencia al método <span class="lang:java decode:true crayon-inline">sayInstanceHello</span>, observa que esta vez utilizamos el objeto en lugar de la clase, ya que este método no es <span class="lang:java decode:true crayon-inline">static</span>. Al ejecutar el método se imprimirá <em>“Hey!!! i&#8217;am a instance hello”</em>.<br />
Otra de las formas de implementar la referencia a métodos es por medio de un objeto arbitrario. Se dice arbitrario, porque en realidad no sabes sobre que objeto vamos hacer la referencia, pero si sabes el tipo de datos, por lo tanto, podemos asumir los métodos que tiene para referenciarlos. Un ejemplo de esto está en las líneas 29-31. Veamos lo que vamos a hacer, tenemos un Array de Strings el cual tiene una serie de nombre que queremos ordenar, para lo cual vamos a utilizar la clase <span class="lang:java decode:true crayon-inline">Arrays</span>, esta clase nos permite ordenar Objetos que implementen la interface <span class="lang:java decode:true crayon-inline">Comparator</span>, esta interface es una interface funcional debido a que solo tiene el método <span class="lang:java decode:true crayon-inline">public int compareTo(T o)</span>, por lo que podríamos mandar una referencia a un método que pueda implementarla, en este caso veamos que al método <span class="lang:java decode:true crayon-inline">sort</span> le mandamos el array de nombre y una referencia al método <span class="lang:java decode:true crayon-inline">compareToIgnoreCase</span> el cual tiene la siguiente definición <span class="lang:java decode:true crayon-inline">public int compareToIgnoreCase(String str)</span>, veamos que tanto <span class="lang:java decode:true crayon-inline">compareTo</span> y <span class="lang:java decode:true crayon-inline">compareToIgnoreCase</span> reciben el <span class="lang:java decode:true crayon-inline">String</span> a comprar y los dos regresan un <span class="lang:java decode:true crayon-inline">int</span>, por lo tanto la referencia a métodos es compatible. Lo que pasa entonces en la línea 30, es que la lista será iterada, y por cada String, llamará a su método <span class="lang:java decode:true crayon-inline">compareToIgnoreCase</span>, notemos algo muy importante…. La instrucción <span class="lang:java decode:true crayon-inline">String::compareToIgnoreCase</span>, no es una referencia a un método estático como podríamos creer, en su lugar, como sabemos que es una lista de String, le estamos diciendo que de cada String que está en la lista, use su método <span class="lang:java decode:true crayon-inline">compareToIgnoreCase</span> para comprar el siguiente elemento de la lista. Es por eso que se llama referencia a métodos de objetos arbitrario, porque conocemos el tipo de datos, pero no el objeto concreto. Al imprimir la lista, veremos una lista correctamente ordenada: <em>“Hey!!! i&#8217;am a ordered array [Alex, Fausto, Maria, Oscar, Perla, Samuel]”</em></p>
<figure id="attachment_3207" aria-describedby="caption-attachment-3207" style="width: 800px" class="wp-caption aligncenter"><a href="https://codmind.com/courses/java-lambda"><img loading="lazy" class="wp-image-3207 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg" alt="Curso de Java Lambdas + Streams" width="800" height="450" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption id="caption-attachment-3207" class="wp-caption-text">Te invitamos a ver nuestro curso de Java Lambdas + Streams para aprender a programar con el nuevos paradigma funcional.</figcaption></figure>
<p>Finalmente, tenemos la referencia a constructores, la cual nos permitirá asignar la referencia de un constructor a el método de la interface funcional, de tal forma que cuando ejecutemos el método, este en realidad llamará al constructor de la clase referenciada. Como vemos en las líneas 34-35, estamos haciendo referencia al constructor mediante los <span class="lang:java decode:true crayon-inline">::</span> (cuatro puntos) seguido del operador <span class="lang:java decode:true crayon-inline">new</span>, así de fácil. Finalmente cuando ejecutemos el método <span class="lang:java decode:true crayon-inline">sayHello</span>, este en realidad llamará al constructor de la clase <span class="lang:java decode:true crayon-inline">Hello</span> y se imprimirá en pantalla: <em>“Hey!!! i&#8217;am a constructor”</em>. Recordemos que las clases pueden tener más de un constructor, ¿entonces como sabe Java a que constructor llamar?, pues es fácil, llamará al que tenga compatibilidad con los parámetros de la interface funcional. Como en este caso, el método <span class="lang:java decode:true crayon-inline">sayHello</span>, no recibe parámetros, entonces se llama al constructor sin parámetros de la clase <span class="lang:java decode:true crayon-inline">Hello</span>. Por otra parte, si el método recibiera un <span class="lang:java decode:true crayon-inline">String</span>, entonces llamaría al constructor que recibe un solo parámetro. ¡Así de fácil!</p>
<h2>Conclusiones:</h2>
<p>Desde mi punto de vista, los métodos y constructores referenciados fueron de las cosas más extrañas que me parecieron del Java 8, pues al inicio no lograba entender cómo funcionaba a la perfección, sobre todo la referencia a métodos de un objeto arbitrario, pero la verdad es que es solo práctica, tenemos que descargar el código y probar, modificar las clases y probar de nuevo. Si no experimentamos se nos hará muy difícil entenderlas, pero más a un recordarlas cuando las necesitemos.<br />
Como verás esta fue una guía rápida de los métodos referenciados, pero si tienes dudas, déjamelas en los comentarios y con gusto las resolveré. Recuerda que puedes descargar el código y a practicar.</p>
<p>Si estas interesado en seguir aprendiendo más de las mejoras de Java 8 te dejo este <a href="https://www.oscarblancarteblog.com/tag/java8/">Enlace</a> donde están todos los artículos que he escrito sobre Java 8</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2017/02/27/java-8-metodos-referenciados/">Java 8 – Métodos referenciados</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2017/02/27/java-8-metodos-referenciados/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1439</post-id>	</item>
		<item>
		<title>Java 8 – Interfaces funcionales</title>
		<link>https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/</link>
					<comments>https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Thu, 08 Dec 2016 09:00:10 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java8]]></category>
		<category><![CDATA[POO]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1279</guid>

					<description><![CDATA[<p>Se le conoce como interface funcional a toda aquella interface que tenga solamente un método abstracto, es decir puede implementar uno o más métodos default, pero deberá tener forzosamente un único método abstracto. Si no te queda claro que es un método abstracto en una interface, es un método sin implementar. Las interfaces funcionales es [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/">Java 8 – Interfaces funcionales</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignleft wp-image-1275 size-thumbnail" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/12/Duke_8-copy1-150x150.png" alt="Interfaces funcionales" width="150" height="150" />Se le conoce como interface funcional a toda aquella interface que tenga solamente un método abstracto, es decir puede implementar uno o más <u>métodos default</u>, pero deberá tener forzosamente un único método abstracto. Si no te queda claro que es un método abstracto en una interface, es un método sin implementar.</p>
<p>Las interfaces funcionales es un nuevo concepto que fue agregado a partir de la versión 8 de Java y cobran su importancia al utilizar expresiones lambda (λ).</p>
<h2></h2>
<h2>Ejemplo de interfaces funcionales:</h2>
<p>A continuación, veremos ejemplos de dos interfaces funcionales válidas:<span id="more-1279"></span></p>
<pre class="lang:java decode:true " title="IStrategy.java">package com.osb.functionalinterface;

/**
 * @author Oscar Blancarte 
 */
public interface IStrategy {
    public String sayHelloTo(String name);
}</pre>
<p>En esta interface, definimos un método que manda un saludo a la persona que le pasamos como parámetro, pero todavía no está definido el cuerpo del método.</p>
<pre class="lang:java decode:true " title="IStrategy.java">package com.osb.functionalinterface;

/**
 * @author Oscar Blancarte 
 */
public interface IStrategy {
    
    public String sayHelloTo(String name);
    
    public default String sayHelloWord(){
        return "Hello word";
    }
}</pre>
<p>Esta segunda interface, también es una interface funcional, ya que solo tiene un método abstracto.</p>
<p>Otra forma de asegurarnos de que estamos definiendo correctamente una interface funcional, es anotarla con <span class="lang:java decode:true crayon-inline ">@FunctionalInterface</span> , ya que al anotarla el IDE automáticamente nos arrojara un error si no cumplimos con las reglas de una interface funcional. Sin embargo, es importante resaltar que en tiempo de ejecución no nos dará un comportamiento diferente, puesto que es utilizada para prevenir errores al momento de definir las interfaces. Veamos cómo quedaría la clase anterior con esta anotación:</p>
<pre class="lang:java decode:true " title="IStrategy.java">package com.osb.functionalinterface;

/**
 * @author Oscar Blancarte 
 */
@FunctionalInterface
public interface IStrategy {
    
    public String sayHelloTo(String name);
    
    public default String sayHelloWord(){
        return "Hello word";
    }
}</pre>
<h2>Interfaces funcionales con expresiones lambda:</h2>
<p>Ya con la teoría, veamos cómo podría utilizar la clase <span class="lang:java decode:true crayon-inline ">IStrategy</span>  mediante expresiones lambda:</p>
<pre class="lang:java decode:true" title="Main.java">package com.osb.functionalinterface;

/**
 * @author Oscar Blancarte
 */
public class Main {
    public static void main(String[] args) {
        IStrategy strategy = (name) -&gt; "Hello " + name;
        
        System.out.println(strategy.sayHelloTo("Oscar Blancarte"));
        System.out.println(strategy.sayHelloWord());
    }
}</pre>
<p>Veamos como en la línea 8 definimos una expresión lamba en donde concatena <strong>Hello</strong> con el nombre de la persona que es pasada como parámetro, luego esta expresión es asignada a la variable a la variable <span class="lang:java decode:true crayon-inline ">strategy</span> , la cual es de tipo <span class="lang:java decode:true crayon-inline ">IStrategy</span> . Luego de esto mandamos llamar al método <span class="lang:java decode:true crayon-inline ">sayHelloTo</span>  el cual nos regresa el saludo para <strong>Oscar Blancarte</strong>, seguido en la línea 11 llamamos al método <span class="lang:java decode:true crayon-inline ">sayHelloWord</span> , el cual manda un <strong>Hello Word</strong>.</p>
<figure id="attachment_3207" aria-describedby="caption-attachment-3207" style="width: 800px" class="wp-caption aligncenter"><a href="https://codmind.com/courses/java-lambda"><img loading="lazy" class="wp-image-3207 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg" alt="Curso de Java Lambdas con Streams" width="800" height="450" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption id="caption-attachment-3207" class="wp-caption-text">Te invitamos a ver nuestro curso de Java Lambdas + Streams para aprender a programar con el nuevos paradigma funcional.</figcaption></figure>
<p>Como vemos la expresión lambda siempre se asigna al método abstracto, por este motivo el método <span class="lang:java decode:true crayon-inline">sayHelloTo</span>  es implementado con el cuerpo de la expresión lamba, mientras que el método <span class="lang:java decode:true crayon-inline ">sayHelloWord</span>  continua con la misma implementación que viene desde la interface.</p>
<p><img loading="lazy" class="aligncenter size-large wp-image-1280" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/12/Interfaces-funcionales-1024x387.png" alt="Interfaces funcionales" width="648" height="245" /></p>
<p>Observemos la imagen anterior, cuando una expresión lambda es asignada a una interface, está siempre implementará el método abstracto, es por esta razón por la que solo puede existir un método abstracto y muchos defaults.</p>
<p>Finalmente, el resultado de la ejecución es el siguiente:</p>
<pre class="lang:java decode:true">Hello Oscar Blancarte

Hello word</pre>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/">Java 8 – Interfaces funcionales</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/12/08/java-8-interfaces-funcionales/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1279</post-id>	</item>
		<item>
		<title>Java 8 – Default Method</title>
		<link>https://www.oscarblancarteblog.com/2016/12/06/java-8-default-method/</link>
					<comments>https://www.oscarblancarteblog.com/2016/12/06/java-8-default-method/#comments</comments>
		
		<dc:creator><![CDATA[oblancarte]]></dc:creator>
		<pubDate>Tue, 06 Dec 2016 09:00:31 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[java8]]></category>
		<category><![CDATA[POO]]></category>
		<guid isPermaLink="false">http://www.oscarblancarteblog.com/?p=1274</guid>

					<description><![CDATA[<p>Una de las novedades que trae Java 8 a nivel del lenguaje, son los Default Method o Métodos default, los cuales permiten agregar métodos implementados en las interfaces. Antes de la versión 8 de Java era totalmente imposible definirles cuerpo a los métodos de las interfaces ya que nos marcaba error de compilación. Para agregar [&#8230;]</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/12/06/java-8-default-method/">Java 8 – Default Method</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" class="alignleft wp-image-1275 size-thumbnail" src="http://www.oscarblancarteblog.com/wp-content/uploads/2016/12/Duke_8-copy1-150x150.png" alt="Default Method" width="150" height="150" />Una de las novedades que trae Java 8 a nivel del lenguaje, son los Default Method o Métodos default, los cuales permiten agregar métodos implementados en las interfaces. Antes de la versión 8 de Java era totalmente imposible definirles cuerpo a los métodos de las interfaces ya que nos marcaba error de compilación.</p>
<p>Para agregar un método default solo será necesario marcar un método con el operador <span class="lang:java decode:true crayon-inline">default</span> , veamos un ejemplo de cómo se implementan:</p>
<pre class="lang:java decode:true">public default double getTotal(){
  return getQuantity() * getPrice();
}</pre>
<p>Los métodos default se utilizan cuando es necesario implementar un cuerpo sin la necesidad de tener que implementar por separado una clase abstracta, además los métodos por default se pueden sobrescribir en caso de que la implementación por default no cumpla con lo que requerimos. Tenemos que resaltar que los métodos default no remplazan a las clases abstractas, pues estas últimas son mucho más potentes, debido a que nos permiten definir propiedades a nivel de clase, constructores y métodos privados. Veamos una limitante de los métodos default:</p>
<p><span id="more-1274"></span></p>
<pre class="lang:java decode:true">public default double getTotal(){
  return quantity * price;
}</pre>
<p>Esta interface nos va a marcar error en tiempo de compilación, debido a que no es posible declarar propiedades de clase y mucho menos interactuar con ellas, por lo que estamos limitados a trabajar con los parámetros o con los métodos definidos en la misma interface o que extiende de otra.</p>
<h2>Un ejemplo práctico:</h2>
<p>Imaginemos que estamos programando un sistema que procesa ordenes de varios tipos, cómo el caso de un ERP, este sistema, podría crear varios tipos de órdenes, como una orden de compra, venta, embarque, etc. todas estas órdenes podrían tener algo en común, cómo, por ejemplo, un total, una lista de ítems asociados a la orden y los ítems pueden tener una cantidad de productos y un precio, así mismo los detalles tendrían un total.</p>
<p>El código completo de este articulo lo puedes encontrar en GitHub: https://github.com/oscarjb1/DefaultMethod.git</p>
<p>Lo interesante aquí es que si todas las ordenes tiene un total, ¿no sería bueno tener una definición del método por default que nos calcule el total y a la vez los ítems también implementen su método para obtener el total? De la misma forma, si una orden tiene ítems, no sería bueno definir un método que permite agregar los ítems.</p>
<p>Veamos cómo quedaría si implementáramos los métodos por default, implementaremos dos interfaces, una que representa una order (<span class="lang:java decode:true crayon-inline ">IOrder</span> ) y otra que representa los ítems (<span class="lang:java decode:true crayon-inline ">IOrderItem</span> ):</p>
<pre class="lang:java decode:true " title="IOrder.java">package com.osb.defaultmethod;

import java.util.List;

/**
 * @author Oscar Blancarte
 */
public interface IOrder {
    
    public List&lt;IOrderItem&gt; getOrderItem();
    
    public default double getTotal(){
        double total = 0;
        for (IOrderItem item : getOrderItem()) {
            total += item.getTotal();
        }
        return total;
    }
    
    public default void addOrderItem(IOrderItem orderItem){
        getOrderItem().add(orderItem);
    }
}</pre>
<p>Analicemos los métodos de la clase IOrder:</p>
<ul>
<li><strong>getOrderItem:</strong> método que nos regresará los ítems que tiene la orden, no lo podemos implementar porque no es posible definir propiedades a nivel de clase, salvo constantes. Por lo que la clase que la implemente deberá de regresar una lista de ítems.</li>
<li><strong>getTotal:</strong> este método nos regresará el total de la orden, es decir la sumatoria de todos los ítems de la orden. Cuanta con el operador default lo que nos permite implementarlo recorriendo todos los ítems de la orden y sumando su total.</li>
<li><strong>addOrderItem:</strong> método default que nos permite agregar fácilmente nuevos ítems a la orden.</li>
</ul>
<pre class="lang:java decode:true" title="IOrderItem.java">package com.osb.defaultmethod;

/**
 * @author Oscar Blancarte
 */
public interface IOrderItem {
    
    public double getQuantity();
    public double getPrice();
    
    public default double getTotal(){
        return getQuantity() * getPrice();
    }
}</pre>
<p>Esta segunda interface representa los ítems de la orden, cuanta con los métodos:</p>
<ul>
<li><strong>getQuantity:</strong> deberá retornar la cantidad de productos que tiene la línea.</li>
<li><strong>getPrice<u>:</u></strong> deberá de retornar el precio por producto.</li>
<li><strong>getTotal:</strong> método default que calcula el total de la línea, multiplicando la cantidad por el precio.</li>
</ul>
<p>Hasta este punto ya hemos implementado todos los métodos default y continuaremos creando un par de clases concretas que implementen estas dos interfaces para ver cómo funcionaría en tiempo de ejecución. Para esto crearemos las siguientes clases:</p>
<pre class="lang:java decode:true " title="SalesOrder.java">package com.osb.defaultmethod;

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

/**
 * @author Oscar Blancarte
 */
public class SalesOrder implements IOrder{
    
    private List&lt;IOrderItem&gt; orderItems;

    @Override
    public List&lt;IOrderItem&gt; getOrderItem() {
        if(orderItems==null){
            orderItems = new ArrayList&lt;&gt;();
        }
        return orderItems;
    }
}</pre>
<p>En esta clase representará una orden de venta, por lo cual deberá de implementar la interface <span class="lang:java decode:true crayon-inline">IOrder</span> , pero como podemos ver, solo nos pedirá que implementemos el método <span class="lang:java decode:true crayon-inline ">getOrderItem</span>  el cual es el único que no es default, los métodos <span class="lang:java decode:true crayon-inline ">getTotal</span>  y <span class="lang:java decode:true crayon-inline ">addOrderItem</span>  ya estarán implementados por default y se podrán utilizar sin necesidad de declararlos en la clase.</p>
<p>El método <span class="lang:java decode:true crayon-inline ">getOrderItem</span>  solo regresa la lista de ítems, en caso de que la lista sea nula la crea y la retorna.</p>
<p>La siguiente clase representa los ítems de la orden de venta:</p>
<pre class="lang:java decode:true " title="SalesOrderItem.java">package com.osb.defaultmethod;

/**
 * @author Oscar Blancarte
 */
public class SalesOrderItem implements IOrderItem {
    
    private double quantity;
    private double price;

    public SalesOrderItem(double quantity, double price) {
        this.quantity = quantity;
        this.price = price;
    }
    
    @Override
    public double getQuantity() {
        return quantity;
    }

    @Override
    public double getPrice() {
        return price;
    }
    
}</pre>
<p>Podemos observar que implementan la interface <span class="lang:java decode:true crayon-inline ">IOrderItem</span>  la cual nos pedirá que implementemos los métodos <span class="lang:java decode:true crayon-inline ">getQuantity</span>  y <span class="lang:java decode:true crayon-inline ">getPrice</span>  los cuales ya hemos explicado. El método <span class="lang:java decode:true crayon-inline ">getTotal</span>  ya está implementado por default desde la interface, por lo que ya no será necesario implementarlo en la clase.</p>
<p>Finalmente, la clase <span class="lang:java decode:true crayon-inline ">Main</span> , en donde pondremos a prueba lo que hemos aprendido para ver cómo se comportan los métodos por default en tiempo de ejecución:</p>
<pre class="lang:java decode:true " title="Main.java">package com.osb.defaultmethod;

/**
 * @author Oscar Blancarte
 */
public class Main {
    public static void main(String[] args) {
        SalesOrder salesOrder = new SalesOrder();
        salesOrder.addOrderItem(new SalesOrderItem(10, 100));
        salesOrder.addOrderItem(new SalesOrderItem(1, 20));
        System.out.println("total ==&gt; " +salesOrder.getTotal() );
    }
}</pre>
<p>Lo primero que hacemos es crear una instancia de la Orden de venta (línea 8), luego en las líneas 9 y 10 agregamos dos nuevos ítems. Notemos que el método <span class="lang:java decode:true crayon-inline ">addOrderItem</span>  esta implementado como default en la clase <span class="lang:java decode:true crayon-inline ">IOrde</span> . Cada ítem define un precio y la cantidad.</p>
<figure id="attachment_3207" aria-describedby="caption-attachment-3207" style="width: 800px" class="wp-caption aligncenter"><a href="https://codmind.com/courses/java-lambda"><img loading="lazy" class="wp-image-3207 size-full" src="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg" alt="Curso de Java Lambdas con Streams" width="800" height="450" srcset="https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md.jpg 800w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-300x169.jpg 300w, https://www.oscarblancarteblog.com/wp-content/uploads/2020/08/banner-md-768x432.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></a><figcaption id="caption-attachment-3207" class="wp-caption-text">Te invitamos a ver nuestro curso de Java Lambdas + Streams para aprender a programar con el nuevos paradigma funcional.</figcaption></figure>
<p>Finalmente, en la línea 11 imprimimos el total de la orden, el total de la orden es calculado desde el método default de la clase <span class="lang:java decode:true crayon-inline ">IOrder</span>  sumando el total de los ítems y el total de cada ítem también es calculado mediante el método default implementado desde la interface <span class="lang:java decode:true crayon-inline ">IOrderItem</span> .</p>
<p>Como resultado de la ejecución tendremos:</p>
<p><span class="lang:java decode:true crayon-inline ">total ==&gt; 1020.0</span></p>
<h2>Conclusiones:</h2>
<p>Los métodos default son sin duda una gran utilidad, sobre todo porque nos evita tener que tener que implementar clases abstractas, pero como ya lo mencionamos no las sustituyen.</p>
<p>The post <a rel="nofollow" href="https://www.oscarblancarteblog.com/2016/12/06/java-8-default-method/">Java 8 – Default Method</a> appeared first on <a rel="nofollow" href="https://www.oscarblancarteblog.com">Oscar Blancarte - Software Architecture</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.oscarblancarteblog.com/2016/12/06/java-8-default-method/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1274</post-id>	</item>
	</channel>
</rss>
