自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java Optional:優(yōu)雅處理空值的藝術(shù)

開發(fā) 前端
Optional類是Java 8引入的一個(gè)重要特性,它提供了一種更加優(yōu)雅和安全的方式來處理可能為null的對(duì)象。通過合理使用Optional,我們可以有效減少空指針異常的發(fā)生,使代碼更加健壯和易于維護(hù)。

在Java編程中,空指針異常(NullPointerException)是開發(fā)者經(jīng)常遇到的一個(gè)“坑”。為了更加優(yōu)雅地處理可能為null的對(duì)象,Java 8引入了Optional類。Optional是一個(gè)可以包含也可以不包含非null值的容器對(duì)象,它提供了一種更好的方式來處理可能為null的對(duì)象,避免直接使用null值導(dǎo)致的空指針異常。

1.基礎(chǔ)用法

創(chuàng)建Optional對(duì)象

  • 使用Optional.of(T value):如果value為null,則拋出NullPointerException。
  • 使用Optional.ofNullable(T value):允許value為null。
Optional<String> optionalString1 = Optional.of("Hello, World!");
Optional<String> optionalString2 = Optional.ofNullable(null); // 不拋出異常

獲取值

  • 使用get():如果Optional對(duì)象包含值,則返回該值,否則拋出NoSuchElementException。
  • 使用orElse(T other):如果Optional對(duì)象包含值,則返回該值,否則返回other。
String result1 = optionalString1.get(); // 返回 "Hello, World!"
String result2 = optionalString2.orElse("Default Value"); // 返回 "Default Value"

檢查值是否存在

  • 使用isPresent():如果Optional對(duì)象包含值,則返回true,否則返回false。
  • 使用ifPresent(Consumer consumer):如果Optional對(duì)象包含值,則執(zhí)行給定的操作。
boolean isPresent = optionalString1.isPresent(); // 返回 true
optionalString1.ifPresent(value -> System.out.println(value)); // 輸出 "Hello, World!"

2.高階用法

轉(zhuǎn)換值

  • 使用map(Function mapper):如果Optional對(duì)象包含值,則對(duì)其應(yīng)用給定的函數(shù),返回包含結(jié)果的Optional對(duì)象。
Optional<Integer> optionalLength = optionalString1.map(String::length); // 返回 Optional[13]

平坦化Optional

  • 使用flatMap(Function> mapper):如果Optional對(duì)象包含值,則對(duì)其應(yīng)用給定的函數(shù),并返回結(jié)果Optional對(duì)象;如果結(jié)果為null,則返回一個(gè)空的Optional對(duì)象。
Optional<String> optionalUpperCase = optionalString1.flatMap(value -> Optional.ofNullable(value.toUpperCase())); // 返回 Optional["HELLO, WORLD!"]

過濾值

  • 使用filter(Predicate predicate):如果Optional對(duì)象包含的值滿足給定的謂詞條件,則返回該Optional對(duì)象;否則返回一個(gè)空的Optional對(duì)象。
Optional<String> optionalFiltered = optionalString1.filter(value -> value.contains("World")); // 返回 Optional["Hello, World!"]
Optional<String> optionalFilteredEmpty = optionalString1.filter(value -> value.contains("Java")); // 返回 Optional.empty()

自定義默認(rèn)值

  • 使用orElseThrow(Supplier exceptionSupplier):如果Optional對(duì)象不包含值,則拋出由給定的Supplier提供的異常。
try {
    String result3 = optionalString2.orElseThrow(() -> new IllegalArgumentException("Value is missing!"));
} catch (IllegalArgumentException e) {
    System.out.println(e.getMessage()); // 輸出 "Value is missing!"
}

代碼示例匯總

import java.util.Optional;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
public class OptionalExample {
    public static void main(String[] args) {
        // 基礎(chǔ)用法
        Optional<String> optionalString1 = Optional.of("Hello, World!");
        Optional<String> optionalString2 = Optional.ofNullable(null);
        String result1 = optionalString1.get(); // 獲取值
        String result2 = optionalString2.orElse("Default Value"); // 使用默認(rèn)值
        boolean isPresent = optionalString1.isPresent(); // 檢查值是否存在
        optionalString1.ifPresent(value -> System.out.println(value)); // 如果存在,執(zhí)行操作
        // 高階用法
        Optional<Integer> optionalLength = optionalString1.map(String::length); // 轉(zhuǎn)換值
        Optional<String> optionalUpperCase = optionalString1.flatMap(value -> Optional.ofNullable(value.toUpperCase())); // 平坦化Optional
        Optional<String> optionalFiltered = optionalString1.filter(value -> value.contains("World")); // 過濾值
        try {
            String result3 = optionalString2.orElseThrow(() -> new IllegalArgumentException("Value is missing!")); // 自定義默認(rèn)值(拋出異常)
        } catch (IllegalArgumentException e) {
            System.out.println(e.getMessage());
        }
    }
}

3.小結(jié)

Optional類是Java 8引入的一個(gè)重要特性,它提供了一種更加優(yōu)雅和安全的方式來處理可能為null的對(duì)象。通過合理使用Optional,我們可以有效減少空指針異常的發(fā)生,使代碼更加健壯和易于維護(hù)。希望本文能幫助你更好地理解和應(yīng)用Optional。

責(zé)任編輯:武曉燕 來源: JAVA充電
相關(guān)推薦

2023-10-08 11:09:22

Optional空指針

2024-10-15 15:58:11

2023-08-04 08:52:52

Optional消滅空指針

2022-07-11 10:51:25

Java 8OptionalNPE

2024-05-06 12:30:51

Go語言中間件

2025-01-20 07:10:00

LambdaJavanull

2024-08-12 08:28:35

2023-10-10 13:23:18

空指針異常Java

2024-12-06 10:12:20

2021-11-15 06:56:45

系統(tǒng)運(yùn)行空指針

2017-06-29 11:26:08

Python數(shù)據(jù)可視化

2024-02-01 12:09:17

Optional容器null

2024-02-28 09:03:20

Optional空指針Java

2020-04-10 10:22:12

Java判空編程語言

2020-09-25 11:30:20

Java判空代碼

2019-03-11 09:18:20

Java 8Stream數(shù)據(jù)結(jié)構(gòu)

2023-11-18 09:17:56

Optional代碼

2020-12-28 06:20:27

OptionalTryjava

2017-06-03 16:49:37

Python數(shù)據(jù)可視化

2024-08-01 11:41:54

C#OneOf返回值
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)