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

(parameters) -> expression

O bé, si hi ha més d'una expressió:

(parameters) -> { statements; }

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

Mòdul 2: Flux de Control

Mòdul 3: Programació Orientada a Objectes

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

Mòdul 8: Multithreading i Concurrència

Mòdul 9: Xarxes

Mòdul 10: Temes Avançats

Mòdul 11: Frameworks i Llibreries de Java

Mòdul 12: Construcció d'Aplicacions del Món Real

© Copyright 2024. Tots els drets reservats