English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Controllo di flusso Java

Array Java

Java orientato agli oggetti (I)

Java orientato agli oggetti (II)

Java orientato agli oggetti (III)

Java 異常處理

Lista Java

Queue (coda) Java

Map di Java

Set di Java

Input/Output (I/O) Java

Reader/Writer Java

Altri argomenti Java

Classe Optional migliorata in Java 9

Nuove funzionalità Java 9

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()

metodo stream()

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]

Metodo ifPresentOrElse()

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().

Esempio online

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.

Metodo or()

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

Nuove funzionalità Java 9