<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AlexanDev_CWA</title>
    <description>The latest articles on DEV Community by AlexanDev_CWA (@alexandevcwa).</description>
    <link>https://dev.to/alexandevcwa</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F975110%2Fc2d7a38b-dd84-4c21-a3f4-a5777fe27fb8.png</url>
      <title>DEV Community: AlexanDev_CWA</title>
      <link>https://dev.to/alexandevcwa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexandevcwa"/>
    <language>en</language>
    <item>
      <title>Instalar y Configurar Oracle 12c 12.1.0.2 SE en Docker y Ubuntu 20.04 LTS (Single Instace)</title>
      <dc:creator>AlexanDev_CWA</dc:creator>
      <pubDate>Thu, 09 Nov 2023 18:52:50 +0000</pubDate>
      <link>https://dev.to/alexandevcwa/instalar-y-configurar-oracle-12c-12102-se-en-docker-y-ubuntu-2004-lts-single-instace-3een</link>
      <guid>https://dev.to/alexandevcwa/instalar-y-configurar-oracle-12c-12102-se-en-docker-y-ubuntu-2004-lts-single-instace-3een</guid>
      <description>&lt;p&gt;Actualmente, Docker es una herramienta necesaria para nuestros entornos para exponer servicios por medio de contenedores, hoy vamos a aprender como instalar Oracle 12c 12.1.0.2 SE sobre Docker en Ubuntu 20.04 LTS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requerimientos de instalación
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://releases.ubuntu.com/20.04/" rel="noopener noreferrer"&gt;Sistema operativo Ubuntu 20.04 LTS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Oracle 12c 12.1.0.2 lo puedes descargar desde &lt;a href="https://edelivery.oracle.com/osdc/faces/Home.jspx" rel="noopener noreferrer"&gt;Oracle Software Delivery&lt;/a&gt;, para esto necesitas crear una cuenta de Oracle que es completamente gratis, el paquete que debes de buscar es el siguiente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4dlaxmazq8qsgb16ugn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc4dlaxmazq8qsgb16ugn.png" alt="Paquete de referencia a descargar"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalación de Docker
&lt;/h2&gt;

&lt;p&gt;para la instalación de Docker te puedes guiar de la documentación oficial de Docker&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/install/ubuntu/" rel="noopener noreferrer"&gt;Documentación de Instalación de Docker en Ubuntu&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creación de imagen para Docker
&lt;/h2&gt;

&lt;p&gt;Para iniciar la creación de Oracle 12c para Docker necesitamos acceder a nuestro servidor Ubuntu y clonar el siguiente &lt;a href="https://github.com/alexandevcwa/docker-images" rel="noopener noreferrer"&gt;repositorio&lt;/a&gt;, este repositorio contiene scripts para construir una imagen de Docker para correr una base de datos Oracle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~
git clone https://github.com/alexandevcwa/docker-images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creación de imagen Docker
&lt;/h3&gt;

&lt;p&gt;Al tener clonado el repositorio, debemos ir a la ruta siguiente del repositorio clonado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/docker-images/OracleDatabase/SingleInstance/dockerfiles/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El directorio &lt;code&gt;dickerfiles&lt;/code&gt; contiene múltiples configuraciones para las diferentes versiones de base de datos Oracle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ubuntu:~/docker-images/OracleDatabase/SingleInstance/dockerfiles$ ls
11.2.0.2  12.1.0.2  12.2.0.1  18.3.0
18.4.0  19.3.0  21.3.0  23.3.0
buildContainerImage.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora vamos a acceder al directorio &lt;code&gt;12.1.0.2&lt;/code&gt; donde vamos a mover los archivos de instalación de Oracle 12c 12.1.0.2 descargados anteriormente, tienen que ser 2 archivos descargados con los siguientes nombre, &lt;code&gt;V77388-01_1of2.zip&lt;/code&gt; y &lt;code&gt;V77388-01_2of2.zip&lt;/code&gt; en la versión Standard Edition 2 de Oracle 12c, a estos archivos se les debe de cambiar el nombre por los siguientes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;V77388-01_1of2.zip linuxamd64_12102_database_se2_1of2.zip
&lt;span class="nb"&gt;mv &lt;/span&gt;V77388-01_2of2.zip linuxamd64_12102_database_se2_2of2.zip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora debemos de mover los archivos al directorio &lt;code&gt;12.1.0.2&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mv &lt;/span&gt;linuxamd64_12102_database_se2_1of2.zip V77388-01_2of2.zip linuxamd64_12102_database_se2_2of2.zip ~/docker-images/OracleDatabase/SingleInstance/dockerfiles/12.1.0.2/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ya con los archivos de instalación de la base de datos, el repositorio clonado y Docker Engine instalado en Ubuntu, debemos de construir la imagen corriendo el siguiente script &lt;code&gt;buildContainerImage.sh&lt;/code&gt; que está ubicado en la ruta &lt;code&gt;~/docker-images/OracleDatabase/SingleInstance/dockerfiles&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./buildContainerImage.sh &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; 12.1.0.2 &lt;span class="nt"&gt;-t&lt;/span&gt; oracle-12.1.0.2-se &lt;span class="nt"&gt;-s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Al finalizar el proceso de construcción de la imagen, debe de mostrar el siguiente mensaje.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#########################
DATABASE IS READY TO USE!
#########################
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora correremos una instancia de la imagen para construir el contenedor con el siguiente comando, para mayor descripción del comando y adaptarlo a tu entorno, visita el siguiente &lt;a href="https://github.com/alexandevcwa/docker-images/tree/main/OracleDatabase/SingleInstance#running-oracle-database-in-a-container" rel="noopener noreferrer"&gt;link&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; oracle-12.1.0.2-se-db &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;-p&lt;/span&gt; 1521:1521 &lt;span class="nt"&gt;-p&lt;/span&gt; 5500:5500 &lt;span class="nt"&gt;-p&lt;/span&gt; 2484:2484 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--ulimit&lt;/span&gt; &lt;span class="nv"&gt;nofile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1024:65536 &lt;span class="nt"&gt;--ulimit&lt;/span&gt; &lt;span class="nb"&gt;nproc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2047:16384 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--ulimit&lt;/span&gt; &lt;span class="nv"&gt;stack&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10485760:33554432 &lt;span class="nt"&gt;--ulimit&lt;/span&gt; &lt;span class="nv"&gt;memlock&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3221225472 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ORACLE_SID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;orcl &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ORACLE_PDB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;orcrlpdb &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ORACLE_PWD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;manager1 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;INIT_SGA_SIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2560M &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;INIT_PGA_SIZE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2560M &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ORACLE_EDITION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;standard &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ORACLE_CHARACTERSET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;WE8MSWIN1252 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ENABLE_ARCHIVELOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;ENABLE_TCPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt; oracle-12.1.0.2-data/opt/oracle/oradata oracle-12.1.0.2-se:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si deseas visualizar el proceso de construcción del contenedor, con el siguiente comando lo puedes ver.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker longs &lt;span class="nt"&gt;-f&lt;/span&gt; &amp;lt;container_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuración de archivo de configuración init.ora
&lt;/h3&gt;

&lt;p&gt;Para configurar el archivo de configuración &lt;code&gt;init.ora&lt;/code&gt; debemos de tener la herramienta &lt;code&gt;vi&lt;/code&gt; instalada en el contenedor, con el siguiente comando lo podremos hacer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; root &amp;lt;container_id&amp;gt; bash
yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; vi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez instalada la herramienta, debemos de ir al directorio donde está ubicado el archivo de configuración y crear una copia del archivo con la siguiente nomenclatura &lt;code&gt;init&amp;lt;nombre_instancia&amp;gt;.ora&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;  /opt/oracle/product/12.1.0.2/dbhome_1/dbs
&lt;span class="nb"&gt;cp &lt;/span&gt;init.ora init&amp;lt;nombre_instancia&amp;gt;.ora
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez creada la copia del archivo de configuración, debemos acceder al archivo para editarlo con la siguiente configuración.&lt;br&gt;
Esta configuración no es estándar, debes adaptarla a tus recursos del sistema y las necesidades del tamaño de tu base de datos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db_name='nombre_instancia'
*.db_unique_name='nombre_instancia'
processes = 150
audit_file_dest='/opt/oracle/admin/&amp;lt;NOMBRE_INSTANCIA&amp;gt;/adump'
audit_trail ='db'
SGA_TARGET=3G
PGA_AGGREGATE_TARGET=1G
db_block_size=8192
db_domain=''
db_recovery_file_dest='/opt/oracle/fast_recovery_area'
db_recovery_file_dest_size=2G
diagnostic_dest='/opt/oracle'
dispatchers='(PROTOCOL=TCP) (SERVICE=&amp;lt;NOMBRE_INSTANCIA&amp;gt;XDB)'
open_cursors=300
remote_login_passwordfile='EXCLUSIVE'
undo_tablespace='UNDOTBS1'
control_files = (/opt/oracle/oradata/ORCL/control01.ctl)
compatible ='12.1.0.2.0'
ENABLE_PLUGGABLE_DATABASE=TRUE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esta configuración la base de datos debería de arrancar sin problemas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Errores comunes
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Puede ocurrir que al acceder por medio de &lt;code&gt;sqlplus&lt;/code&gt; e iniciar la  base de datos con startup, muestre un mensaje de tipo &lt;code&gt;ORA-01102: cannot mount database in EXCLUSIVE mode&lt;/code&gt;, esto significa que existe ya una instancia de base de datos, para solucionar este error debemos de matar esa instancia de base de datos con el siguiente comando.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Comando para obtener los procesos&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps &lt;span class="nt"&gt;-ef&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;smon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Salida&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;oracle@aff8acd3a125 dbs]&lt;span class="nv"&gt;$ &lt;/span&gt;ps &lt;span class="nt"&gt;-ef&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;smon
oracle        50       1  0 18:01 ?        00:00:00 ora_smon_ORCL
oracle      1679    1213  0 18:40 pts/0    00:00:00 &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;--color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;auto smon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Matar instancia de base de datos existente&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;kill&lt;/span&gt; &amp;lt;id_proceso&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Para corregir cualquier problema es recomendable reiniciar el contenedor completamente.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker restart &amp;lt;container_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Verificar que el contenedor y la instancia de base de datos se inició correctamente&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs &amp;lt;container_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>oracle</category>
      <category>database</category>
      <category>ubuntu</category>
      <category>linux</category>
    </item>
    <item>
      <title>Interfaces funcionales en Java al estilo delegado de C#</title>
      <dc:creator>AlexanDev_CWA</dc:creator>
      <pubDate>Wed, 04 Oct 2023 17:27:54 +0000</pubDate>
      <link>https://dev.to/alexandevcwa/interfaces-funcionales-en-java-al-estilo-delegado-de-c-2dfh</link>
      <guid>https://dev.to/alexandevcwa/interfaces-funcionales-en-java-al-estilo-delegado-de-c-2dfh</guid>
      <description>&lt;p&gt;En Java, no hay una característica nativa de "delegados" como en C#. Sin embargo, Java proporciona interfaces funcionales y expresiones lambda que pueden lograr patrones similares a través de conceptos como programación funcional y devolución de llamadas (callbacks).&lt;/p&gt;

&lt;p&gt;Las interfaces funcionales son interfaces que tienen un solo método abstracto y pueden ser utilizadas con expresiones lambda. Un ejemplo común es la interfaz &lt;code&gt;Runnable&lt;/code&gt; que se utiliza con hilos en Java. A partir de Java 8, también se introdujo el paquete &lt;code&gt;java.util.function&lt;/code&gt;, que incluye varias interfaces funcionales predefinidas como &lt;code&gt;Consumer&lt;/code&gt;, &lt;code&gt;Supplier&lt;/code&gt;, &lt;code&gt;Predicate&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;A continuación, te muestro un ejemplo simple utilizando una interfaz funcional y una expresión lambda:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Interfaz funcional con un solo método abstracto&lt;/span&gt;
&lt;span class="nd"&gt;@FunctionalInterface&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;MiDelegado&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;hacerAlgo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mensaje&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Uso de una expresión lambda para implementar el delegado&lt;/span&gt;
        &lt;span class="nc"&gt;MiDelegado&lt;/span&gt; &lt;span class="n"&gt;miDelegado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mensaje&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Haciendo algo: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;mensaje&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Llamada al método de la interfaz funcional&lt;/span&gt;
        &lt;span class="n"&gt;miDelegado&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hacerAlgo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"¡Hola desde la expresión lambda!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este ejemplo, &lt;code&gt;MiDelegado&lt;/code&gt; es una interfaz funcional con un método llamado &lt;code&gt;hacerAlgo&lt;/code&gt;. Luego, se utiliza una expresión lambda para proporcionar la implementación de ese método. La expresión lambda se asigna a una instancia de la interfaz funcional (&lt;code&gt;miDelegado&lt;/code&gt; en este caso) y se llama al método de la interfaz funcional.&lt;/p&gt;

&lt;p&gt;Aunque no es exactamente lo mismo que los delegados en C#, proporciona una forma similar de lograr funcionalidades de devolución de llamadas y programación funcional en Java.&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
