Java 8 va introduir una sèrie de novetats i millores significatives que han canviat la manera com els desenvolupadors escriuen codi en Java. Aquestes característiques no només han millorat la productivitat, sinó que també han fet el llenguatge més modern i funcional. En aquest tema, explorarem les principals característiques de Java 8, incloent-hi les expressions lambda, les interfícies funcionals, les Streams API, les noves API de data i hora, i les millores en les interfícies.
Expressions Lambda
Les expressions lambda són una de les característiques més importants introduïdes en Java 8. Permeten escriure codi més concís i llegible, especialment quan es treballa amb col·leccions i API de Streams.
Sintaxi
O bé, si hi ha més d'una expressió:
Exemple
// Abans de Java 8 Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello, World!"); } }; // Amb Java 8 Runnable runnableLambda = () -> System.out.println("Hello, World!");
Interfícies Funcionals
Una interfície funcional és una interfície que només té un mètode abstracte. Aquestes interfícies poden ser implementades utilitzant expressions lambda.
Exemple
@FunctionalInterface interface MyFunctionalInterface { void execute(); } // Implementació amb lambda MyFunctionalInterface func = () -> System.out.println("Executing..."); func.execute();
Streams API
La Streams API proporciona una manera funcional de processar seqüències d'elements. Permet realitzar operacions com el filtratge, la transformació i l'agregació de dades de manera eficient.
Exemple
List<String> names = Arrays.asList("John", "Jane", "Jack", "Doe"); // Filtrar noms que comencen amb 'J' i convertir-los a majúscules List<String> filteredNames = names.stream() .filter(name -> name.startsWith("J")) .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(filteredNames); // [JOHN, JANE, JACK]
Nova API de Data i Hora
Java 8 introdueix una nova API de data i hora en el paquet java.time
, que és més intuïtiva i menys propensa a errors que les classes Date
i Calendar
anteriors.
Exemple
LocalDate today = LocalDate.now(); LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1); Period age = Period.between(birthday, today); System.out.println("Age: " + age.getYears() + " years");
Millores en les Interfícies
Java 8 permet definir mètodes per defecte i mètodes estàtics en les interfícies. Això permet afegir noves funcionalitats a les interfícies sense trencar les implementacions existents.
Exemple
interface MyInterface { // Mètode abstracte void abstractMethod(); // Mètode per defecte default void defaultMethod() { System.out.println("Default method"); } // Mètode estàtic static void staticMethod() { System.out.println("Static method"); } } class MyClass implements MyInterface { @Override public void abstractMethod() { System.out.println("Abstract method implementation"); } } public class Main { public static void main(String[] args) { MyClass myClass = new MyClass(); myClass.abstractMethod(); myClass.defaultMethod(); MyInterface.staticMethod(); } }
Exercicis Pràctics
Exercici 1: Filtratge i Transformació amb Streams
Descripció: Escriu un programa que filtri una llista de números per obtenir només els parells i després multiplica cada número per 2.
Codi:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); List<Integer> evenDoubled = numbers.stream() .filter(n -> n % 2 == 0) .map(n -> n * 2) .collect(Collectors.toList()); System.out.println(evenDoubled); // [4, 8, 12, 16, 20] } }
Exercici 2: Utilització de la Nova API de Data i Hora
Descripció: Escriu un programa que calculi quants dies falten per al teu proper aniversari.
Codi:
import java.time.LocalDate; import java.time.Month; import java.time.Period; public class Main { public static void main(String[] args) { LocalDate today = LocalDate.now(); LocalDate nextBirthday = LocalDate.of(today.getYear(), Month.JANUARY, 1); if (nextBirthday.isBefore(today) || nextBirthday.isEqual(today)) { nextBirthday = nextBirthday.plusYears(1); } Period period = Period.between(today, nextBirthday); System.out.println("Days until next birthday: " + period.getDays()); } }
Resum
En aquest tema, hem explorat les principals característiques introduïdes en Java 8, incloent-hi les expressions lambda, les interfícies funcionals, les Streams API, la nova API de data i hora, i les millores en les interfícies. Aquestes característiques han modernitzat el llenguatge Java i han proporcionat eines més potents i flexibles per als desenvolupadors. En el proper tema, explorarem les novetats introduïdes en Java 9 i més enllà.
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