Condivisione della tecnologia

Un articolo per comprendere Opzionale in Java

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

1. Introduzione agli Opzionali

Opzionale è una nuova classe introdotta in Java8. Il problema principale che risolve è NullPointerException.
Traduzione del testo originale (traduzione Baidu, i miei difetti in inglese): un oggetto contenitore, che può contenere o meno valori non nulli. isPresent() restituirà true se il valore è presente. Se non è presente alcun valore, l'oggetto viene considerato vuoto e isPresent() restituisce false.
Vengono forniti metodi aggiuntivi che dipendono dalla presenza del valore contenuto, come orElse() (restituisce il valore predefinito se il valore non è presente) e ifPresent() (esegue l'azione quando il valore è presente).
Questa è una classe basata sul valore; i programmatori dovrebbero considerare le istanze uguali come intercambiabili e non dovrebbero utilizzare le istanze per la sincronizzazione, altrimenti potrebbe verificarsi un comportamento imprevedibile. Ad esempio, la sincronizzazione potrebbe non riuscire in una versione futura.

La funzione principale che capisco qui è che puoi passare isPresent() metodo per aiutare a giudicare la vacuità dell'oggetto, e poi passaremap(), orElse()ifPresent() La combinazione di altri metodi può ridurre notevolmente la lunghezza del giudizio nel codice.

2. Interfacce comunemente utilizzate

先介绍一下常用所有的接口;
注意:
	1. 此列表是列出了本人觉得有意义的接口不是全部。
	2. 当前jdk版本为17,其他版本可能会没有一些方法,例如:`or()` 方法在jdk1.9中增加的
  • 1
  • 2
  • 3
  • 4
Nome dell'interfacciaBreve descrizione della funzione
Optional<T> empty()Costruisci un vuotoOptional oggetto
Optional<T> of(T value)Costruisci un non vuotoOptional oggetto se为空则报错
Optional<T> ofNullable(T value)costruire unOptional Oggetto, può essere vuoto!
T get()Ottieni un valore oggetto generico, se value为空,则报错
boolean isPresent()Vuoto altrimentinull Allora lo ètrue
boolean isEmpty()Vuoto senull Allora lo ètrue
ifPresent(Consumer)Passa una coppia di funzioni di interfaccia, quando i dati不为空Questa funzione viene eseguita quando
ifPresentOrElse(Consumer, Runnable) Due parametri, il primo viene eseguito quando non è vuoto e il secondo viene eseguito quando è vuoto. Sono tutte funzioni dell'interfaccia.
Optional<T> filterUn filtro per gli oggetti
Optional<U> map(Function)Metodo di conversione
Optional<U> flatMap(Function)Metodo di conversione, comunemente utilizzato con la conversione da più livelli a un livello
Optional<T> or(Supplier)Quando ottieni l'oggetto为空Quando se ne crea uno nuovo in base alla funzione dell'interfacciaOptionaloggetto
T orElse(T)Quando ottieni l'oggetto为空Ottieni un oggetto generico specificato quando
T orElseThrow()不为空 Restituisci oggetto,为空 MaNoSuchElementException
T orElseThrow(Supplier)不为空 Restituisci oggetto,为空 Ma指定异常

2.1 Le interfacce comuni sono facili da usare

下面是常用接口的一些简单的演示
  • 1

2.1.1 Metodi comuni di creazione

// 1. 构建一个空的 Optional 对象没有任何问题
Optional<Object> empty = Optional.empty();

 // 2. 构建一个非空的 Optional 对象没有任何问题
 Optional<Object> aa = Optional.of("123");
 // 3. 构建一个空的 Optional 对象直接报错  ================ 会报错 of不允许为空
 Optional<Object> bb = Optional.of(null);

 // 4. 构建一个空的 Optional 对象没有任何问题
 Optional<Object> cc = Optional.ofNullable(null);

 // 5. 构建一个非空的 Optional 对象没有任何问题
 Optional<Object> dd = Optional.ofNullable("123");

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.1.2 Metodi comuni per ottenere valori


Optional<Object> cc = Optional.ofNullable(null);
// 1. 如果为空的时候获取值就会直接报错
Object o = cc.get();
// 2. 如果对象为空,则获取 or 中的 get 方法的值,否则则获取cc的 get 方法中的值
Object o1 = cc.or(() -> Optional.ofNullable("123")).get();
// 3. 如果对象为空,则直接获取的是 123, orElse()中的参数是非空的。 如果对象不为空则直接获取到对象的值
Object o2 = cc.orElse("123");
// 4. 如果对象为空,则获取 or 中的 get 方法的值,否则则获取cc的 get 方法中的值
Object o3 = cc.orElseGet(() -> Optional.ofNullable("123"));

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.1.3 Metodi comuni di giudizio

Optional<Object> cc = Optional.ofNullable(null);
// 1. 存在则返回true
boolean present = cc.isPresent();
// 2. 为null返回true
boolean empty = cc.isEmpty();
  • 1
  • 2
  • 3
  • 4
  • 5

2.1.4 Modalità operativa dopo la sentenza


Optional<Object> cc = Optional.ofNullable(null);
// 1. 如果对象不为空,则执行方法体的内容,否则没有任何操作
cc.ifPresent(item->{
    System.out.println("不为空则执行我"+item);
});

// 2. 如果对象不为空,则执行方法体的内容,否则没有任何操作
cc.ifPresentOrElse(item->{
    System.out.println("不为空则执行我"+item);
},()->{
    System.out.println("为空则执行我");
});

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2.2 Introduzione al metodo cartografico

map 方法的使用跟 Stream 中的map方法一样,我的理解这里面的所有的接口方法与 Stream 中重名的用法都是一样的
  • 1

@Data
public static class User{
    private String name;
    private Integer age;
}
@Test
void getMapTest(){

    User user = new User();
    user.setName("123");
    Optional<User> optionalUser = Optional.of(user);
    // 1. 直接获取 user 对象的 name 的值,这里 map 是当用户不为空的时候执行的
    Optional<String> name = optionalUser.map(User::getName);
    System.out.println(name.isEmpty()); // 输出 false

    Optional<User> optionalUser2 = Optional.ofNullable(null);
    // 2. 直接获取 user 对象的 name 的值,这里 map 是当用户不为空的时候执行的
    Optional<String> name2 = optionalUser2.map(User::getName);
    System.out.println(name2.isEmpty()); // 输出 true
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

2.2 Altri metodi

Altri metodi:

2.2.1 Metodo di filtro

filter : Questo metodo serve per filtrare,Optional<Path> p = uris. stream().filter(uri -> !isProcessedYet(uri)).findFirst() .map(Paths::get); Praticamente non l'ho mai usato qui e sento che non esiste uno scenario di utilizzo.

2.2.2 Metodo FlatMap

flatMap: Capisco che questo metodo sia una conversione unboxing: ad esempio, put Stream<Optional<T>> Convertire inOptional<T>

Stream<Optional<T>> os = ....
Stream<T> s = os.flatMap(Optional::stream)
  • 1
  • 2

3. Esempi comunemente usati

TODO 这里后面再不吧,暂时也没有太合适的例子
  • 1

4. Riepilogo

Optional Introdotto in Java 8, fornisce un modo più elegante e sicuro per gestire valori potenzialmente nulli.Principalmente attraversoor ,orElse , ifPresent È possibile utilizzare metodi funzionali per determinare in modo elegante lo spazio vuoto ed eseguire operazioni non vuote. Ciò può ridurre più livelli diif Il giudizio rende il codice elegante, ma gli svantaggi lo sono函数式 Il metodo ridurrà la leggibilità del codice.e anche bisogno di farloLambda Ci vuole una certa comprensione.