Les expressions lambda són una característica poderosa introduïda a Java 8 que permeten escriure codi més concís i llegible. Les lambdes són essencialment funcions anònimes que poden ser tractades com a objectes de primera classe. Això significa que es poden passar com a arguments a mètodes, retornar des de mètodes i assignar a variables.
Continguts
Què és una Expressió Lambda?
Una expressió lambda és una manera concisa de representar una funció anònima. Les lambdes permeten escriure codi més compacte i llegible, especialment quan es treballa amb col·leccions i API de fluxos.
Beneficis de les Expressions Lambda
- Concises: Redueixen la quantitat de codi necessari.
- Llegibles: Fan que el codi sigui més fàcil de llegir i entendre.
- Flexibles: Es poden utilitzar en qualsevol lloc on es necessiti una instància d'una interfície funcional.
Sintaxi de les Expressions Lambda
La sintaxi bàsica d'una expressió lambda és la següent:
O, si el cos de la lambda és més complex:
Components de la Sintaxi
- Paràmetres: Els paràmetres de la funció. Si no hi ha paràmetres, es poden ometre els parèntesis.
- Operador Lambda: L'operador
->
separa els paràmetres del cos de la lambda. - Cos: El cos de la lambda, que pot ser una expressió única o un bloc de codi.
Exemples de Sintaxi
// Lambda sense paràmetres () -> System.out.println("Hello, World!"); // Lambda amb un sol paràmetre x -> x * x; // Lambda amb múltiples paràmetres (x, y) -> x + y; // Lambda amb un bloc de codi (x, y) -> { int sum = x + y; return sum; };
Exemples Pràctics
Exemple 1: Filtrar una Llista
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class LambdaExample { public static void main(String[] args) { List<String> names = Arrays.asList("Anna", "John", "Mike", "Sara"); // Filtrar noms que comencen amb 'A' List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A")) .collect(Collectors.toList()); System.out.println(filteredNames); // Output: [Anna] } }
Exemple 2: Ordenar una Llista
import java.util.Arrays; import java.util.List; public class LambdaExample { public static void main(String[] args) { List<String> names = Arrays.asList("Anna", "John", "Mike", "Sara"); // Ordenar noms en ordre alfabètic invers names.sort((a, b) -> b.compareTo(a)); System.out.println(names); // Output: [Sara, Mike, John, Anna] } }
Interfícies Funcionals
Una interfície funcional és una interfície que conté exactament un mètode abstracte. Les expressions lambda es poden utilitzar per implementar interfícies funcionals. Java proporciona diverses interfícies funcionals predefinides en el paquet java.util.function
.
Exemple d'Interfície Funcional
@FunctionalInterface interface MyFunctionalInterface { void myMethod(); } public class LambdaExample { public static void main(String[] args) { MyFunctionalInterface myFunc = () -> System.out.println("Lambda Executed"); myFunc.myMethod(); // Output: Lambda Executed } }
Exercicis Pràctics
Exercici 1: Filtrar i Transformar una Llista
Escriu una expressió lambda per filtrar una llista de números per obtenir només els parells i després multiplica cada número per 2.
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class LambdaExercise { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // Filtrar i transformar List<Integer> result = numbers.stream() .filter(n -> n % 2 == 0) .map(n -> n * 2) .collect(Collectors.toList()); System.out.println(result); // Output: [4, 8, 12, 16, 20] } }
Exercici 2: Ordenar una Llista d'Objectes
Escriu una expressió lambda per ordenar una llista d'objectes Person
per edat.
import java.util.Arrays; import java.util.List; class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name + " (" + age + ")"; } } public class LambdaExercise { public static void main(String[] args) { List<Person> people = Arrays.asList( new Person("Anna", 25), new Person("John", 30), new Person("Mike", 20), new Person("Sara", 22) ); // Ordenar per edat people.sort((p1, p2) -> Integer.compare(p1.age, p2.age)); System.out.println(people); // Output: [Mike (20), Sara (22), Anna (25), John (30)] } }
Solucions
Solució a l'Exercici 1
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class LambdaExerciseSolution { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); // Filtrar i transformar List<Integer> result = numbers.stream() .filter(n -> n % 2 == 0) .map(n -> n * 2) .collect(Collectors.toList()); System.out.println(result); // Output: [4, 8, 12, 16, 20] } }
Solució a l'Exercici 2
import java.util.Arrays; import java.util.List; class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name + " (" + age + ")"; } } public class LambdaExerciseSolution { public static void main(String[] args) { List<Person> people = Arrays.asList( new Person("Anna", 25), new Person("John", 30), new Person("Mike", 20), new Person("Sara", 22) ); // Ordenar per edat people.sort((p1, p2) -> Integer.compare(p1.age, p2.age)); System.out.println(people); // Output: [Mike (20), Sara (22), Anna (25), John (30)] } }
Conclusió
Les expressions lambda són una eina poderosa en Java que permeten escriure codi més concís i llegible. Són especialment útils quan es treballa amb col·leccions i API de fluxos. En aquest tema, hem après la sintaxi bàsica de les lambdes, hem vist exemples pràctics i hem treballat amb interfícies funcionals. Els exercicis pràctics proporcionats ajuden a reforçar els conceptes apresos.
Curs de Programació en Java
Mòdul 1: Introducció a Java
- Introducció a Java
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Operadors
Mòdul 2: Flux de Control
Mòdul 3: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Mètodes
- Constructors
- Herència
- Polimorfisme
- Encapsulació
- Abstracció
Mòdul 4: Programació Orientada a Objectes Avançada
Mòdul 5: Estructures de Dades i Col·leccions
Mòdul 6: Gestió d'Excepcions
Mòdul 7: Entrada/Sortida de Fitxers
- Lectura de Fitxers
- Escriptura de Fitxers
- Fluxos de Fitxers
- BufferedReader i BufferedWriter
- Serialització
Mòdul 8: Multithreading i Concurrència
- Introducció al Multithreading
- Creació de Fils
- Cicle de Vida dels Fils
- Sincronització
- Utilitats de Concurrència
Mòdul 9: Xarxes
- Introducció a les Xarxes
- Sockets
- ServerSocket
- DatagramSocket i DatagramPacket
- URL i HttpURLConnection