Espressioni Lambda con Java 8

Tra le più novità che Java 8 offre le espressioni di Lambda degli Stati Uniti.
In questo tutorial vedremo ciò che consiste in quali tipi come crearli e Come usarli.

Indice del contenuto

  • 1. INTRODUZIONE
  • 2. Ambiente
  • 3. Tipi
    • 3.1. Consumatori
    • 3.2. Fornitori
    • 3.3. Funzioni
      • 3.3.1. Operatori UNIRIS
      • 3.3.2. Avversatori binari
    • 3.4. PREDICATI
  • 4. Riferimento ai metodi
  • 5. Utilizzare
  • 6. CONCLUSIONI
  • 7. Riferimenti

Introduzione

Le espressioni lambda sono funzioni anonime, cioè funzioni che non hanno bisogno di una classe.
La tua sintassi di base è dettagliata di seguito:

Sintassi

  1. L’operatore Lambda (- >) separa la Dichiarazione dei parametri della dichiarazione della funzione della funzione.
  2. Parametri:
    • Quando si dispone di un singolo parametro non è necessario utilizzare le parentesi.
    • quando lo fai Non avere parametri, o quando ne hai due o più, è necessario utilizzare parentesi.
  3. corpo lambda:
    • Quando il corpo dell’espressione lambda ha una singola riga non è necessario utilizzare i tasti e non è necessario specificare la clausola di ritorno nel caso in cui devono restituire valori.
    • Quando il corpo dell’espressione lambda ha più di una linea è necessario Per utilizzare i tasti ed è necessario includere la clausola di ritorno nel caso in cui la funzione È necessario restituire un valore.

Alcuni esempi di espressioni lambda possono essere:

  • z – > Z + 2
  • () – > system.out.println (” Messaggio 1 “)
  • Int Lunghezza, INT ALTEZZA) – > {Altezza di ritorno * Lunghezza; }
  • (stringa x) – > {
    stringa ritorno = x;
    ritorno = ritorno.concat (“***”);
    ritorno ritorno;
    }

Come abbiamo visto le espressioni Lambda sono funzioni anonime e possono essere utilizzate dove il tipo accettato è un’interfaccia funzionale, ma … Cos’è un’interfaccia Funzionale?
Un’interfaccia funzionale è un’interfaccia con uno e solo un metodo astratto. La dichiarazione è esattamente la stessa delle normali interfacce con due funzionalità aggiuntive:

  • ha un singolo metodo astratto, come abbiamo già detto.
  • opzionalmente può essere testato come @ Functionalinterface.

Il motivo per cui l’interfaccia ha un singolo metodo astratto è che sarà l’espressione lambda che fornirà l’implementazione per quel metodo.

Qui ci sono alcuni Esempi di interfaccia funzionali:

Java

1
2
4

TD>

@FUNZIONEInterface
Interfaccia pubblica Runnable {
Public Abstract Void Run ();
}

Java

1
2
3
5

6 / TD>

Interfaccia pubblica MiInterface {
default void saludia () {
system.out. Println (“tutto il meglio!”);
}
Abstract Public Int calcola (INT DATA1, INT DATA2);
}

Java

1
2
3
5
6
7

/ div>

@functionalinterface
comparatore dell’interfaccia pubblica {
/ / predefinito e statico I metodi sono diritti
int Confronta (T O1, T O2);
// Il metodo Equals (Object Obj) è implementato implicitamente dalla classe dell’oggetto.
boolean equivals (oggetto obj);
}

Ambiente

Il tutorial è scritto utilizzando il seguente ambiente:

  • hardware: MacBook Pro 17 ‘(2,66 GHz Intel Core I7, 8 GB DDR3 SDRAM).
  • Sistema Operativo: Mac OS X Lion 10.10.3.
  • NVIDIA GeForce GT 330m 512MB.
  • Crucial MX100 SSD 512 GB.

Tipi

Le espressioni Lambda possono essere classificate come segue:

  • consumatori.
  • Fornitori.
  • funzioni.
    • Open operator.
    • operatori binari.
  • predicati.

>

Dichialleremo quindi uno per uno e contaremo su ciò che consistono.

3.1. Consumatori

Questa è le espressioni lambda che accettano un singolo valore e non restituiscono alcun valore.

java

Messaggio stringa – > system.out.println (messaggio);

Espressioni bicinsstorming, un caso speciale di espressioni di consumo, sono quelli che prendono due valori come parametro e non ritornano il risultato.

java

1

(tasto stringa, valore stringa) – > system.out.println (tasto:% s, valore:% s% n”, Chiave, valore);

3.2. Fornitori

In questo caso, sono espressioni che non hanno parametri ma restituiscono un risultato.

java

() – > return craterandominteger ()

3.3. Funzioni

Quelle espressioni che accettano un argomento e restituiscono un valore di conseguenza e i cui tipi non devono essere uguali.

java

Ordina persisted – > persistiDR.etidientifier ();

Le bifunciazioni sono quelle espressioni di tipo funzione che accettano due argomenti e restituire un risultato.

Java

1

(indirizzo indirizzo , Nome stringa) – > nuova persona (nome, indirizzo);

3.3.1 Operatori Unarios

Caso speciale di funzioni in cui sia il parametro che il valore restituito sono dello stesso tipo.

Java

Messaggio stringa – > Messaggio.TOOLOWRACISO ()

3.3.2 Operatori binari

Come nel caso degli operatori aperti, è un caso speciale di funzioni in cui i due argomenti e il risultato sono di lo stesso tipo.

Java

(Messaggio String, String AnceMessage) – > Message.Concat (TrequeMessage);

3.4. Previsto

Queste sono espressioni che accettano un parametro e restituiscono un valore logico.

java

Messaggio stringa – > Messaggio.lunghezza > 50

Come nei casi precedenti, è possibile avere bimredicato, prevede che invece di avere un parametro, avere due.

java

(percorso, ATT) – IV ID) – > String.Valueof (percorso) .endswith (“. js”) && att.size () > 1024

Riferimenti ai metodi

I riferimenti ai metodi ci consentono di riutilizzare un metodo come a espressione di lambda. Per utilizzare i riferimenti ai metodi, è sufficiente utilizzare la seguente sintassi: RiferimentiObiettivo :: Namename.

java

File :: Canread // anziché file F – > f.canread ();

Con i riferimenti ai metodi viene offerta un’annotazione rapida Per semplici espressioni lambda e ci sono 3 tipi diversi:

  • metodi statici.
  • metodi di istanza di un tipo.
  • Metodi di istanza di un oggetto esistente .

Esempio di utilizzo con metodo statico:

Java

2

(Info stringa) – > system.out.println (info) // espressione di lambda senza riferimenti.
System.out :: PrintLN // Espressione Lambda con riferimento al metodo statico.

Esempio di utilizzo con un metodo tipo:

JAVA

1

(studente studente , Int RegistryIndex) – > Student.GetRannistry (RegistryNedenEx) // espressione Lambda senza riferimenti.
Studente :: GetRearty // Lambda Espressione con riferimento a un metodo di tipo.

Esempio di utilizzo con il metodo di un oggetto esistente:

Java

1

2

studente Studente – > getmarks (studente) // espressione lambda senza riferimenti.
questo :: getmarks // espressione lambda con riferimento al metodo di un oggetto esistente.

Usa

Come abbiamo Visto in precedenza, le Lambdas possono essere utilizzate dove il tipo di parametri accettati è un’interfaccia funzionale. Questo è il caso di molte delle funzionalità offerte da java.util.stream, nuova API che appare con Java 8, che consente la programmazione funzionale su un flusso di valori senza struttura.

Vediamo alcuni esempi :

Esempio 1:

Java

1
3
4
5

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

Utilizzo del codice precedente che utilizziamo Lambdas per:

  • elemento – > element.getvalue == Value_to_compare: concediamo un predicato alla funzione findfirst dell’API Stream, questa funzione utilizzerà il predicato per tornare Un facoltativo (un’altra notizia di Java 8 che ha già provato Daniel Díaz nel suo tutorial che gioca con la classe opzionale in Java 8.) con El Primer Valor Quenga La Expresión Lambda.
  • System.out :: PrintLN: StabiltLN: Estacemos Un consumo PARA LA LA FUNCIÓN IFSESSENT, DE LA CLASE OCTIONAL, QUE en CASO DE EXIS EL VALOR, EJECUTARÁ LA EXPRESIONN LAMBDA .

EJEMPLO 2:

Java

1
2
3
4
5
6

MAP < stringa, INTEGER > MAP = NUOVO TREAKAP < ();
map.put ….
StringBuilder StringBuilder = New StringBuilder ();
map.Foceach ((lettera, numero) – > stringbuilder.append (lettera.concat (stringa.valueof (numero))));
system.out.println (stringbuilder.tostring ());

en el anterior código utilizamos una lambda para Procesar valori, Un través de un consumidor, Que Concatena Los Valores Enteros Que Se Ottienen del Mapa.

EJEMPLO 3:

java

1
2
3
4
5
6
7

Prova (BUFFEREDReader Reader = Files.newBufferedReader (Paths.get (“Somelines.txt”), Standardcharsets.utf_8)) {
lettore .lines ()
.flatmap (linea – > stream.of (line.split (word_regexp)))
.distinct ( )
.map (stringa :: tolowercase)
.forioso (system.out :: println);
}

el código anteriore Toma Un Fichero, Recrere Sus Líneas, Mapea Los, Mapea Los Valores Obtenidos de Cada Linea Que Corsan con la expresión Word_regexp, Filtra Aquellos Que Sean distinto, Los Pasa a Minúsculas y los Imantom por Pantalla UNO A UNO.

  • Linea – > stream.of (line.split (word_regexp)): devuelve non streaming con los valori obtenidos de asporlica la división de la línea mediante la expresión regolare. El Método Flatmap Irá Recogiendo Los Streams Generados de Esta manera y los convertirá a un único stream queo podrá serresado con postersinediad.
  • stringa :: tolowercase: Transforma los strings del stream a minúsculas.
  • System.out :: PrintLN: Ya lo vimos con anterioridad, muestra da stringa consola cada.

conclusioni

las expresiones lambda de java 8 nos ofrecen varios mejoras Confondo a Las Versions anteriorses:

  • nos acerca a la programmación funcional.
  • hace nuestro código más preciso y leggible, mejorando, en consisecenza, su mantenibilidad.
  • su Utilización Junto con La Api Stream Hace Más Fácil La Ejecución Concurrente de Tareas.

en este tutorial hemos mostrado en qué consistent y qué tipos fieno, cuándo pueden utilizarse y las differents MANERAS DE UTILIZARLAS. Pendere de Postheres Tutorials Queda Tratar Aspectos Más Avanzados Como Streams Finitos e Infinitos, Utilización de Colectores o Debug di Streams Y Expresiones Lambda.

referencias

  • jdk 8 mooc: lambdas e flussi introduction
  • Oracle Lambda Documentazione espressioni

si quieres Profundizar en Esta y en El Resto de Notadades Que Incluye Java 8, Retrierda Que Ahora Puedes Asistir A Los Cursos Públicos de “Notadades de Java 8”, DONDE TE LLEVAREMOS DE LA MANO PARI SPERIMENTAR Y APREENDER A SACAR TODO EL PARTIDO DE TODOS LOS CAMBIOS del Lenguaje. Asístarás al Día. PUEDES Compostara Las Próximas Convocatorias del Curso “Notadades Java 8”

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *