Expresións de lambda con Java 8

entre as múltiples novidades que Java 8 ofrece expresións de Lambda de Estados Unidos.
Neste tutorial veremos o que consiste, que tipos están aí, como a creación e Como usalos.

Índice de contido

  • 1. Introdución
  • 2. Ambiente
  • 3. Tipos
    • 3.1. Consumidores
    • 3.2. Provedores
    • 3.3. Funcións
      • 3.3.1. Operadores unarios
      • 3.3.2. Opponores binarios
    • 3.4. Predicados
  • 4. Referencia aos métodos
  • 5. Use
  • 6. Conclusións
  • 7. Referencias

Introdución

As expresións lambda son funcións anónimas, é dicir, funcións que non necesitan unha clase.
A súa sintaxe básica está detallada a continuación:

sintaxe

  1. O operador lambda (- >) separa a declaración de parámetros da declaración da función da función.
  2. Parámetros:
    • Cando ten un parámetro único non é necesario usar os parénteses.
    • cando o fagas Non ten parámetros, ou cando ten dous ou máis, é necesario usar parénteses.
  3. Corpo lambda:
    • cando o corpo da expresión lambda ten unha única liña que non é necesario usar as chaves e non necesita especificar a cláusula de devolución no caso de que eles deben devolver valores.
    • Cando o corpo da expresión lambda ten máis dunha liña é necesario Para usar as teclas e é necesario incluír a cláusula de devolución no caso de que a función Debe devolver un valor.

Algúns exemplos de expresións lambda poden ser:

  • z – > z + 2
  • () – > system.out.println (” Mensaxe 1 “)
  • int lonxitude, altura int) – > {altura de retorno * lonxitude; }
  • (string x) – > {
    Retorno de cadea = x;
    Devolver = retorno.concat (“***”);
    Return Return;
    }

Como vimos as expresións lambda son funcións anónimas e pódese usar onde o tipo aceptado é unha interface funcional pero … que é unha interface Funcional?
Unha interface funcional é unha interface cun único método abstracto. A declaración é exactamente a mesma que as interfaces normais con dúas características adicionais:

  • ten un único método abstracto, como xa dixemos.
  • opcionalmente pode ser probado como @ FuncionalInterface.

A razón pola que a interface ten un único método abstracto é que será a expresión lambda que proporcionará a implementación dese método.

Aquí están algúns Exemplos de interface funcional:

java

1
2
4

td>

@Functioniointerface
Interface pública Runnable {
Run abstracto público ();
}

java

1
2
3
5

6 / TD>

Interface pública Miinterface {
Óptica Void Saludia () {
System.out. Println (“Todo o mellor!”);
}
Abstract Int Calculate (int Data1, int Data2);
}

java

1
2
3
5
6
7

/ div>

@FunctionAlinterface
Comparator de interface pública {
/ / default and static Os métodos son elvidos
int compare (t o1, t o2);
// O método é igual (obxecto OBJ) está implementado implícitamente pola clase de obxecto.
boolean é igual (obxecto Obj);
}

ambiente

O tutorial está escrito usando o seguinte ambiente:

  • Hardware: MacBook Pro 17 ‘(2.66 GHz Intel Core i7, 8GB DDR3 SDRAM).
  • System Operativo: Mac OS X Lion 10.10.3.
  • NVIDIA GEFORCE GT 330M 512MB.
  • crucial MX100 SSD 512 GB.

Os tipos

As expresións lambda poden clasificarse do seguinte xeito:

  • consumidores.
  • provedores.
  • funcións.
    • Open operadores.
    • operadores binarios.
  • predicates.

imos detallar un por un e contar co que consisten.

3.1. Consumidores

Esta é a expresións lambda que aceptan un único valor e non devolven ningún valor.

java

Mensaxe de cadea – > system.out.println (mensaxe);

Expresións bicinstorming, un caso especial de expresións de consumo, son aqueles que levan dous valores como parámetro e non devolven resultado.

java

1

(chave de cadea, valor de cadea) – > system.out.println (” clave:% s, valor:% s% n “, Clave, valor);

3.2. Provedores

Neste caso, son expresións que non teñen parámetros senón devolver un resultado.

java

() – > devolver creaceandominteger ()

3.3. Funcións

Esas expresións que acepten un argumento e devolver un valor como resultado e cuxos tipos non teñen que ser o mesmo.

java

a orde persistiu – > persedr.etidientifier ();

As bifunciacións son aquelas expresións de tipo de función que aceptan dous argumentos e devolver un resultado.

java

1

(enderezo de enderezos , Nome de cadea) – > nova persoa (nome, enderezo);

3.3.1 operadores unarios

Caso especial de funcións nas que tanto o parámetro como o valor devolto son do mesmo tipo.

java

Mensaxe de cadea – > Message.tolowerCase ()

3.3.2 Operadores binarios

O mesmo que no caso dos operadores abertos, é un caso especial de funcións nas que os dous argumentos e o resultado son de do mesmo tipo.

java

(Mensaxe de cadea, cadea outroMessage) – > message.concat (outromessage);

3.4. Previsto

Estas son expresións que aceptan un parámetro e devolven un valor lóxico.

java

Mensaxe de cadea – >.lonxitude>

50

Como nos casos anteriores, pode ter bicredicado, predica que no canto de ter un parámetro, ten dous.

java

(PATH, ATT) – > String.valueoOF (PATH) .ENDSWITH (“JS JS”) && attr.size () > 1024

Referencias a métodos

Referencias a métodos permítenos reutilizar un método como un Expresión lambda. Para facer uso de referencias a métodos, basta con usar a seguinte sintaxe: referenciaObjetivo :: namename.

java

Ficheiro :: CanReReReReR // no canto do ficheiro F – > f.canread ();

coas referencias aos métodos ofrécense unha anotación rápida Para expresións de lambda simples e hai 3 tipos diferentes:

  • Métodos estáticos.
  • Métodos de instancia dun tipo.
  • Métodos de instancia dun obxecto existente .

Exemplo de uso con método estático:

iv id = “

JAVA

2

(string info) – > system.out.println (información) // expresión lambda sen referencias.
System.out :: println // Expresión lambda con referencia ao método estático.

Exemplo de uso cun método tipo:

java

1

(estudante de estudante , INT RegistryIndex) – > Student.GetRengistry (RegistryIndex) // Expresión lambda sen referencias.
Estudante :: GETRETIVE // Expresión lambda con referencia a un método tipo.

Exemplo de uso con método dun obxecto existente:

java

1

2

estudante Estudante – > GetMarks (estudante) // Expresión lambda sen referencias.
Isto :: GETCHMELS // Expresión lambda con referencia ao método dun obxecto existente.

UTILIZA

Como temos Visto anteriormente, pódese usar os lambdas onde o tipo de parámetros aceptados é unha interface funcional. Este é o caso de moitas das funcionalidades ofrecidas por java.util.stream, nova API que aparece con Java 8, que permite a programación funcional nun fluxo de valores sen estrutura.

Vexamos algúns exemplos :

exemplo 1:

Java

1
3
4
5

alist = …
alist .stream ()
.findfirst (elemento – > elemento.getValue () == Value_to_Compare)
.ifpresent (System.out :: println);

Usando o código anterior que usamos LambDas para:

  • elemento – > elemento.getValue == Value_to_Compare: concedemos un predicado á función FindFirst da API do fluxo, esta función usará o predicado para devolver A Opcional (Outra noticia de Java 8 que xa probou a Daniel Díaz no seu tutorial xogando coa clase opcional en Java 8.) con el primer valor que corresponer la expresión lambda.
  • System.out :: println: establecemos un consumidor para a función Ifpresent, de la clase opcional, que en caso de existir el valor, ejecutará la expresación lambda .

ejemplo 2:

java

1
2
3
4
5
6

mapa < String, enteiro > map = Novo treemap <> ();
map.put …
StringBuilder StringBuilder = New StringBuilder ();
map.foreach ((letra, número) – > StringBuilder.append (letra.concat (string.valueof (número)));
system.out.println (stringbuilder.toString ());

EN O ANTERIO CÓDIGO UTILIZAMOS UNA LAMBDA PARA PROCESAR VALORES, A Través de ONU Consumidor, que concatena los valores enteros que se obtienen del mapa.

ejemplo 3:

java

1
2
3
4
5
6
7

ty try (bufferedreader lector = ficks.newbufferedReader (patchs.get (“somelines.txt”), standardchars.utf_8)) {
lector .Lines ()
.flatmap (liña – > stream.of (line.split (word_regexp))
.distinta ( )
.Map (cadea :: tolowercase)
.foreach (System.out :: println);
}

el código anterior Toma Un Fichero, Recorre Sus Líneas, Mapea Los Valores Obtenidos de Cada Linea Que corresponden con la expresión Regular Word_ReGexp, Filtra Aquellos Que Sean Distintos, Los Pasa a Minúsculas e Los Imprimir por Pantalla Uno a un.

  • Line – > Stream.of (LINE.SPLIT (WORD_REGEXP)): Devuelve Un Stream cos valores Obtenidos de Aplicar la División da Línea Mediante La Expresión Regular. El Método Flatmap Irá Recogiendo os fluxos Generados de Esta Manera e Los Convertirá a un único río Que podrá ser procesado con posterioridad.
  • String :: Tolowercase: Transforma Los Strings del Stream a Minúsculas.
  • System.out :: println: ya lo vimos con anterioridad, muestra por consola cadea cadena.

Conclusións

las expresiones lambda de java 8 nos ofrecen varias mejoras con respecto a versións anteriores anteriores:

  • nos acerca a la programación funcional.
  • Hace Nuestro Código más preciso y legible, mejorando, en consecuencias, su mantenibilidad.
  • su Utilización Junto con A API Stream Hace más fácil la ejecución Concurrente de tarea.

en Este Tutorial Hemos Mostrado en Qué consistente y Qué Tipos Hay, Cuándo PUEDEN UTILIZARSE Y LAS DIFERENTES MANERAS DE UTILIZARLAS. Pendiente de posteriores Tutoriales Queda Tratar Aspectos más Avanzados como fluxos Finitos e Infinitos, Utilización de Colectores o Depuración de correntes e Expresiones Lambda.

referencias

  • JDK 8 MOOC: LambDas e fluxos Introdución
  • Oracle Lambda Expresións Documentación

Si Quieres profundizar en esta y en el resto de novedades que incluye java 8, recuerda que ahora puedes asistir a los cursos púbicos de “novedades de java 8”, DONDE te llevaremos de la mono para experimentar y aprender a sacar todo el partido de todos os cambios Del Lenguaje. Así Estarás Al Día. Puedes comprobar Las Próximas Convocatorias del Curso “Novedades Java 8”

Deixa unha resposta

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *