Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Gestione dei Valori con la Classe Optional | Operazioni Terminali Nello Stream API
Stream API

bookGestione dei Valori con la Classe Optional

In Java, le variabili che memorizzano oggetti possono contenere un valore null. Questo spesso porta a NullPointerException se null non viene gestito correttamente. Questi errori rendono il codice meno affidabile e più difficile da mantenere. Qui entra in gioco Optional.

Pensalo come una scatola—può contenere un valore, oppure può essere vuota. Invece di utilizzare istruzioni if per verificare la presenza di null, si lavora con questa "scatola" e si utilizzano metodi pratici per recuperare in modo sicuro il valore se esiste.

Sintassi e utilizzo di Optional

L'obiettivo principale di Optional è evitare NullPointerException sostituendo i controlli standard if (value != null) con metodi più leggibili.

Esistono tre modi per creare un Optional:

  • Optional.empty() – crea un Optional vuoto senza valore;
  • Optional.of(value) – incapsula l'oggetto fornito, ma solo se è garantito che sia non-null;
  • Optional.ofNullable(value) – incapsula l'oggetto, anche se è null, creando un Optional popolato oppure vuoto.
Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> emptyOpt = Optional.empty(); Optional<String> optWithValue = Optional.of("Laptop"); Optional<String> optNullable = Optional.ofNullable(null); System.out.println("Empty Optional: " + emptyOpt); System.out.println("Optional with value: " + optWithValue); System.out.println("Optional with null: " + optNullable); } }

Se si passa null a Optional.of(value), il programma lancerà una NullPointerException, quindi è consigliabile utilizzare sempre ofNullable() per valori potenzialmente vuoti.

Recupero dei valori da Optional

Per estrarre un valore da un Optional, è possibile utilizzare il metodo get().

Main.java

Main.java

copy
12345678910
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> optWithValue = Optional.of("Laptop"); System.out.println("Final string: " + optWithValue.get()); } }

Qui, get() restituisce l'oggetto effettivo memorizzato all'interno dell'Optional. Tuttavia, se l'Optional è vuoto (contiene null), chiamare get() genera una NoSuchElementException.

Verifica della presenza di un valore

Quando si lavora con Optional, è necessario verificare se contiene un valore. Un modo per farlo è utilizzare isPresent(), che restituisce true se è presente un valore. Tuttavia, spesso si preferisce ifPresent(), poiché esegue una espressione lambda fornita solo se il valore esiste.

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); if (productOpt.isPresent()) { System.out.println("Product found: " + productOpt.get()); } else { System.out.println("Product not found."); } // A more concise approach productOpt.ifPresent(product -> System.out.println("Product: " + product)); } }

Nel primo esempio, si verifica manualmente la presenza di un valore utilizzando isPresent() prima di chiamare get(). Il secondo esempio elimina la necessità di una dichiarazione if utilizzando un'espressione lambda che viene eseguita solo se il prodotto è presente.

Fornire un valore predefinito

A volte, quando un valore è assente, restituire un'alternativa è una buona soluzione. Questo può essere fatto con orElse(), che fornisce un valore di riserva. Se la generazione del valore di riserva richiede una computazione, orElseGet() è più efficiente, poiché esegue la funzione solo quando necessario.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElse("Default product"); System.out.println("Selected product: " + product); String productLazy = productOpt.orElseGet(() -> "Fallback product"); System.out.println("Selected product (lazy): " + productLazy); } }

La differenza è che orElse() crea sempre il valore di riserva, anche se non è necessario, mentre orElseGet() richiama la funzione fornita solo se Optional è vuoto.

Generazione di un'eccezione se il valore manca

In alcuni casi, l'assenza di un valore rappresenta un errore. In queste situazioni, è possibile utilizzare orElseThrow() per generare un'eccezione.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElseThrow(() -> new RuntimeException("Product not found")); System.out.println("Product: " + product); } }

Qui, se l'Optional è vuoto, il programma lancia una RuntimeException. Questo è utile quando un valore mancante rappresenta un errore critico.

Trasformazione dei valori

Spesso, un Optional contiene oggetti complessi, ma potrebbe essere necessario lavorare solo con campi specifici. In questi casi, si utilizza map(), che applica una determinata funzione se è presente un valore.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable("Laptop"); Optional<Integer> nameLengthOpt = productOpt.map(String::length); nameLengthOpt.ifPresent(length -> System.out.println("Product name length: " + length)); } }

Se l'Optional è vuoto, map() restituisce semplicemente Optional.empty(). Altrimenti, applica String::length e restituisce un Optional<Integer>.

Filtraggio dei valori

In alcuni casi è necessario mantenere un valore solo se soddisfa una determinata condizione. Il metodo filter() consente di conservare il valore se il predicato fornito restituisce true oppure di restituire Optional.empty() se la condizione non è soddisfatta.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.of("Laptop"); Optional<String> filteredProductOpt = productOpt.filter(name -> name.length() > 5); filteredProductOpt.ifPresent(name -> System.out.println("Filtered product: " + name)); } }

Se la lunghezza della stringa è maggiore di 5, il valore viene mantenuto; altrimenti, l'Optional diventa vuoto.

1. Cosa succede se si chiama get() su un Optional vuoto?

2. Cosa stamperà questo codice?

3. Quale sarà il risultato del seguente codice?

4. Quale metodo è più indicato per fornire un valore predefinito che viene calcolato solo quando necessario?

question mark

Cosa succede se si chiama get() su un Optional vuoto?

Select the correct answer

question mark

Cosa stamperà questo codice?

Select the correct answer

question mark

Quale sarà il risultato del seguente codice?

Select the correct answer

question mark

Quale metodo è più indicato per fornire un valore predefinito che viene calcolato solo quando necessario?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 5

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Suggested prompts:

What are some common methods provided by the Optional class?

Can you give examples of how to use Optional in Java?

Why is using Optional considered better than checking for null directly?

Awesome!

Completion rate improved to 2.33

bookGestione dei Valori con la Classe Optional

Scorri per mostrare il menu

In Java, le variabili che memorizzano oggetti possono contenere un valore null. Questo spesso porta a NullPointerException se null non viene gestito correttamente. Questi errori rendono il codice meno affidabile e più difficile da mantenere. Qui entra in gioco Optional.

Pensalo come una scatola—può contenere un valore, oppure può essere vuota. Invece di utilizzare istruzioni if per verificare la presenza di null, si lavora con questa "scatola" e si utilizzano metodi pratici per recuperare in modo sicuro il valore se esiste.

Sintassi e utilizzo di Optional

L'obiettivo principale di Optional è evitare NullPointerException sostituendo i controlli standard if (value != null) con metodi più leggibili.

Esistono tre modi per creare un Optional:

  • Optional.empty() – crea un Optional vuoto senza valore;
  • Optional.of(value) – incapsula l'oggetto fornito, ma solo se è garantito che sia non-null;
  • Optional.ofNullable(value) – incapsula l'oggetto, anche se è null, creando un Optional popolato oppure vuoto.
Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> emptyOpt = Optional.empty(); Optional<String> optWithValue = Optional.of("Laptop"); Optional<String> optNullable = Optional.ofNullable(null); System.out.println("Empty Optional: " + emptyOpt); System.out.println("Optional with value: " + optWithValue); System.out.println("Optional with null: " + optNullable); } }

Se si passa null a Optional.of(value), il programma lancerà una NullPointerException, quindi è consigliabile utilizzare sempre ofNullable() per valori potenzialmente vuoti.

Recupero dei valori da Optional

Per estrarre un valore da un Optional, è possibile utilizzare il metodo get().

Main.java

Main.java

copy
12345678910
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> optWithValue = Optional.of("Laptop"); System.out.println("Final string: " + optWithValue.get()); } }

Qui, get() restituisce l'oggetto effettivo memorizzato all'interno dell'Optional. Tuttavia, se l'Optional è vuoto (contiene null), chiamare get() genera una NoSuchElementException.

Verifica della presenza di un valore

Quando si lavora con Optional, è necessario verificare se contiene un valore. Un modo per farlo è utilizzare isPresent(), che restituisce true se è presente un valore. Tuttavia, spesso si preferisce ifPresent(), poiché esegue una espressione lambda fornita solo se il valore esiste.

Main.java

Main.java

copy
123456789101112131415161718
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); if (productOpt.isPresent()) { System.out.println("Product found: " + productOpt.get()); } else { System.out.println("Product not found."); } // A more concise approach productOpt.ifPresent(product -> System.out.println("Product: " + product)); } }

Nel primo esempio, si verifica manualmente la presenza di un valore utilizzando isPresent() prima di chiamare get(). Il secondo esempio elimina la necessità di una dichiarazione if utilizzando un'espressione lambda che viene eseguita solo se il prodotto è presente.

Fornire un valore predefinito

A volte, quando un valore è assente, restituire un'alternativa è una buona soluzione. Questo può essere fatto con orElse(), che fornisce un valore di riserva. Se la generazione del valore di riserva richiede una computazione, orElseGet() è più efficiente, poiché esegue la funzione solo quando necessario.

Main.java

Main.java

copy
123456789101112131415
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElse("Default product"); System.out.println("Selected product: " + product); String productLazy = productOpt.orElseGet(() -> "Fallback product"); System.out.println("Selected product (lazy): " + productLazy); } }

La differenza è che orElse() crea sempre il valore di riserva, anche se non è necessario, mentre orElseGet() richiama la funzione fornita solo se Optional è vuoto.

Generazione di un'eccezione se il valore manca

In alcuni casi, l'assenza di un valore rappresenta un errore. In queste situazioni, è possibile utilizzare orElseThrow() per generare un'eccezione.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable(null); String product = productOpt.orElseThrow(() -> new RuntimeException("Product not found")); System.out.println("Product: " + product); } }

Qui, se l'Optional è vuoto, il programma lancia una RuntimeException. Questo è utile quando un valore mancante rappresenta un errore critico.

Trasformazione dei valori

Spesso, un Optional contiene oggetti complessi, ma potrebbe essere necessario lavorare solo con campi specifici. In questi casi, si utilizza map(), che applica una determinata funzione se è presente un valore.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.ofNullable("Laptop"); Optional<Integer> nameLengthOpt = productOpt.map(String::length); nameLengthOpt.ifPresent(length -> System.out.println("Product name length: " + length)); } }

Se l'Optional è vuoto, map() restituisce semplicemente Optional.empty(). Altrimenti, applica String::length e restituisce un Optional<Integer>.

Filtraggio dei valori

In alcuni casi è necessario mantenere un valore solo se soddisfa una determinata condizione. Il metodo filter() consente di conservare il valore se il predicato fornito restituisce true oppure di restituire Optional.empty() se la condizione non è soddisfatta.

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.Optional; public class Main { public static void main(String[] args) { Optional<String> productOpt = Optional.of("Laptop"); Optional<String> filteredProductOpt = productOpt.filter(name -> name.length() > 5); filteredProductOpt.ifPresent(name -> System.out.println("Filtered product: " + name)); } }

Se la lunghezza della stringa è maggiore di 5, il valore viene mantenuto; altrimenti, l'Optional diventa vuoto.

1. Cosa succede se si chiama get() su un Optional vuoto?

2. Cosa stamperà questo codice?

3. Quale sarà il risultato del seguente codice?

4. Quale metodo è più indicato per fornire un valore predefinito che viene calcolato solo quando necessario?

question mark

Cosa succede se si chiama get() su un Optional vuoto?

Select the correct answer

question mark

Cosa stamperà questo codice?

Select the correct answer

question mark

Quale sarà il risultato del seguente codice?

Select the correct answer

question mark

Quale metodo è più indicato per fornire un valore predefinito che viene calcolato solo quando necessario?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 5
some-alt