首頁  >  文章  >  Java  >  項目 返回選項時要小心

項目 返回選項時要小心

DDD
DDD原創
2024-09-19 06:19:02611瀏覽

Item  Seja criterioso ao retornar opcionais

Java 8 之前的方法:

  • 拋出異常:為特殊情況保留,並且由於堆疊追蹤捕獲而昂貴。
  • 傳回 null:需要特殊程式碼來處理傳回 null 的可能性,這可能會導致 NullPointerException 等錯誤。

Java 8 方法:

  • 引入Optional類,一個可以包含值或為空的不可變容器。
  • 避免使用 null 並簡化缺失值的處理而不引發異常。
  • 方法可以回傳Optional來表示沒有值。

使用Optional的優點:

  • 避免 null 的異常和問題。
  • 允許客戶端決定當值遺失時要做什麼(提供預設值、拋出異常等)。
  • 讓程式碼更簡單,無需明確空處理。

Optional 類別的有用方法:

  • Optional.of(value):建立一個具有非空值的Optional。
  • Optional.ofNullable(value):建立一個Optional,但接受空值。
  • orElse(value):如果Optional為空,則傳回預設值。
  • orElseThrow():如果值不存在,則拋出例外。
  • map()、flatMap()、filter():允許操作Optional中的值。

避免在選用中涉及集合:

  • 對於清單或陣列等容器類型,傳回空集合而不是Optional>。

性能考量:

  • 使用Optional會在物件分配方面產生成本。
  • 對於原始類型,請使用OptionalInt、OptionalLong 和OptionalDouble 以避免封送成本。

小心可選的其他用途:
避免將它們用作 Map 鍵或值或在集合中。
避免將它們用作實例字段,除非有意義,例如在可選 getter 中。

程式碼範例
範例 1:Optional
的基本使用

import java.util.Optional;

public class ExemploOptional {
    public static Optional<String> encontrarNome(String[] nomes, String nomeBuscado) {
        for (String nome : nomes) {
            if (nome.equalsIgnoreCase(nomeBuscado)) {
                return Optional.of(nome);
            }
        }
        return Optional.empty();  // Retorna Optional vazio se não encontrar o nome
    }

    public static void main(String[] args) {
        String[] nomes = {"João", "Maria", "Ana"};
        Optional<String> nomeEncontrado = encontrarNome(nomes, "Maria");

        nomeEncontrado.ifPresent(nome -> System.out.println("Nome encontrado: " + nome));
        System.out.println(nomeEncontrado.orElse("Nome não encontrado"));
    }
}

範例 2:使用 orElseThrow

import java.util.Optional;

public class ExemploOrElseThrow {
    public static Optional<Integer> buscarIdade(String nome) {
        if (nome.equals("João")) {
            return Optional.of(30);
        }
        return Optional.empty();  // Retorna Optional vazio se o nome não for "João"
    }

    public static void main(String[] args) {
        Optional<Integer> idade = buscarIdade("Maria");

        // Lança uma exceção se o valor não estiver presente
        int valorIdade = idade.orElseThrow(() -> new IllegalArgumentException("Idade não encontrada!"));
        System.out.println("Idade: " + valorIdade);
    }
}

範例 3:可選的原始類型

import java.util.OptionalInt;

public class ExemploOptionalInt {
    public static OptionalInt buscarIdade(String nome) {
        if (nome.equals("João")) {
            return OptionalInt.of(30);
        }
        return OptionalInt.empty();  // Retorna OptionalInt vazio se o nome não for "João"
    }

    public static void main(String[] args) {
        OptionalInt idade = buscarIdade("João");

        if (idade.isPresent()) {
            System.out.println("Idade encontrada: " + idade.getAsInt());
        } else {
            System.out.println("Idade não encontrada");
        }
    }
}

以上是項目 返回選項時要小心的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:單號I下一篇:單號I