English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La classe Optional è stata introdotta in Java 8 e l'introduzione di Optional ha risolto molto bene le eccezioni di NullPointer. Nel java 9, sono stati aggiunti tre metodi per migliorare la sua funzionalità:
stream()
ifPresentOrElse()
o()
Sintassi
public Stream<T> stream()
Il metodo stream trasforma un Optional in uno Stream, se l'Optional contiene un valore, restituisce uno Stream contenente quel valore, altrimenti restituisce uno Stream vuoto (Stream.empty()).
import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; public class Tester { public static void main(String[] args) { List<Optional<String>> list = Arrays.asList ( Optional.empty(), Optional.of("A"), Optional.empty(), Optional.of("B")); //filtra la lista per stampare valori non vuoti //se l'oggetto Optional non è vuoto, ottieni il valore nello stream, altrimenti restituisci uno stream vuoto List<String> filteredList = list.stream() .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty()) .collect(Collectors.toList()); //Optional::stream metodo restituirà uno stream di uno o più elementi //o zero elementi se i dati sono presenti o meno. List<String> filteredListJava9 = list.stream() .flatMap(Optional::stream) .collect(Collectors.toList()); System.out.println(filteredList); System.out.println(filteredListJava9); } }
Output dell'esecuzione:
[A, B] [A, B]
Sintassi
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
Il miglioramento del metodo ifPresentOrElse è la presenza di else, che accetta due parametri Consumer e Runnable.
L'uso del metodo ifPresentOrElse è tale che se un Optional contiene un valore, chiama la funzione action sul valore contenuto, ossia action.accept(value), che è uguale a ifPresent; la differenza rispetto al metodo ifPresent è che ifPresentOrElse ha un secondo parametro emptyAction - se l'Optional non contiene un valore, ifPresentOrElse chiama emptyAction, ossia emptyAction.run().
import java.util.Optional; public class Tester { public static void main(String[] args) { Optional<Integer> optional = Optional.of(1); optional.ifPresentOrElse(x -> System.out.println("Valore: " + x), () -> System.out.println("Non presente.")); optional = Optional.empty(); optional.ifPresentOrElse(x -> System.out.println("Valore: " + x), () -> System.out.println("Non presente.")); } }
Output dell'esecuzione:
Valore: 1 Non presente.
Sintassi
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
Se il valore esiste, restituisce il valore specificato da Optional, altrimenti restituisce un valore predefinito.
import java.util.Optional; import java.util.function.Supplier; public class Tester { public static void main(String[] args) { Optional<String> optional1 = Optional.of("Mare"); Supplier<Optional<String>> supplierString = () -> Optional.of("Non Presente"); optional1 = optional1.or(supplierString); optional1.ifPresent(x -> System.out.println("Valore: " + x)); optional1 = Optional.empty(); optional1 = optional1.or(supplierString); optional1.ifPresent(x -> System.out.println("Valore: " + x)); } }
Output dell'esecuzione:
Valore: Mare Valore: Non Presente