国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java基礎(chǔ)教程】(三十一)常用類庫篇 · 第一講:Optional類——解鎖Java的Optional操作,消滅那些隱匿的空指針,還程序世界一個安穩(wěn)!~

這篇具有很好參考價值的文章主要介紹了【Java基礎(chǔ)教程】(三十一)常用類庫篇 · 第一講:Optional類——解鎖Java的Optional操作,消滅那些隱匿的空指針,還程序世界一個安穩(wěn)!~。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【Java基礎(chǔ)教程】(三十一)常用類庫篇 · 第一講:Optional類——解鎖Java的Optional操作,消滅那些隱匿的空指針,還程序世界一個安穩(wěn)!~,# Java基礎(chǔ)教程,java,開發(fā)語言,數(shù)據(jù)庫,后端,java-ee,jvm

1?? 概念

Optional 類是Java 8引入的新特性,旨在解決空值(null)的處理問題。它的設(shè)計目的是為了提供一種更好的方式來處理可能為空的值,避免使用null導(dǎo)致空指針異常。

Optional是一個容器對象,可以持有某個類型的非空值或者空值。它是一個包裝類,用于替代可能為空的引用變量。

下面是Optional類的幾個特征:

  • Optional 可以持有非空的值或空值;
  • 通過一系列方法,可以對 Optional對象進行操作和轉(zhuǎn)換;
  • Optional 提供了一套簡潔的API,方便進行空值處理。

2?? 優(yōu)勢和缺點

優(yōu)點

  • 提高代碼的可讀性和可維護性,明確表達值可能為空的語義;
  • 強制開發(fā)人員顯式地處理空值情況,避免了空指針異常。

缺點

  • 可能引入一些額外的代碼復(fù)雜性,增加代碼量。

3?? 使用

3.1 常用操作API

Java的Optional使用流程如下:

  1. 創(chuàng)建Optional對象:

    • 使用Optional.ofNullable(value)創(chuàng)建一個Optional對象,并將value作為包裝值,value可以是null。
    • 使用Optional.of(value)創(chuàng)建一個Optional 對象,并將 value作為包裝值,value不能為null,否則會拋出NullPointerException
  2. 判斷Optional對象是否包含值:

    • 使用optional.isPresent()方法判斷 Optional 對象是否包含非空值。
      - 使用optional.isEmpty()方法判斷Optional對象是否為空。
  3. 獲取Optional對象的值:

    • 使用optional.get()方法獲取對象中的值。如果Optional對象包含值,返回該值;否則拋出NoSuchElementException異常。
  4. 使用默認值:

    • 使用optional.orElse(defaultValue)方法獲取Optional對象的值。如果對象包含值,則返回該值;否則返回指定的默認值。
    • 使用optional.orElseGet(supplier)方法獲取Optional對象的值。如果對象包含值,則返回該值;否則使用供應(yīng)商函數(shù)生成一個值并返回。
  5. 條件過濾:

    • 使用optional.filter(predicate)方法根據(jù)條件過濾 Optional對象。匹配的話返回當(dāng)前對象,否則返回空的Optional對象。
  6. 轉(zhuǎn)換值類型:

    • 使用optional.map(mapper)方法將Optional 對象中的值轉(zhuǎn)換為mapper函數(shù)的結(jié)果,并返回新的對象。
    • 使用optional.flatMap(mapper)方法類似 map操作,但是返回的是 mapper函數(shù)所返回的Optional對象本身。
  7. 其他常用方法:

    • 使用optional.ifPresent(consumer)方法,如果Optional對象包含值,則執(zhí)行傳入的操作。
    • 使用optional.orElseThrow()方法,獲取Optional對象的值,如果Optional對象包含值,則返回該值;否則拋出NoSuchElementException異常。

在使用Optional 時,應(yīng)根據(jù)具體場景選擇合適的方法進行操作。在鏈式調(diào)用中,可以通過一系列的 Optional 操作來進行連續(xù)、安全和可讀性更高的調(diào)用流程,處理可能為空的值。

此外,使用Optional 還需要注意謹慎使用get()方法獲取對象的值,最好使用更安全的方法如ifPresent、orElse等進行值的處理,以避免空指針異常的發(fā)生。

Java的 Optional類中全部的操作方法API匯總?cè)缦卤恚?/p>

方法名 說明
boolean isPresent() 判斷Optional對象是否包含值。如果Optional對象包含非空值,返回true;否則返回false
ifPresent(Consumer<? super T> consumer) 如果Optional對象包含值,則執(zhí)行傳入的操作
T get() 如果Optional對象包含值,返回該值;否則拋出NoSuchElementException異常
T orElse(T other) 獲取Optional對象的值,若不存在則返回默認值other
T orElseGet(Supplier<? extends T> other) 獲取Optional對象的值,若不存在則使用提供的Supplier生成一個新值并返回
T orElseThrow() 獲取Optional對象的值,若不存在則拋出NoSuchElementException異常
Optional filter(Predicate<? super T> predicate) 如果Optional對象包含值且滿足條件,則返回當(dāng)前Optional對象;否則返回空的Optional對象
map(Function<? super T, ? extends U> mapper) 對Optional對象中的值進行映射操作,返回新的Optional對象
flatMap(Function<? super T, Optional> mapper) 類似map操作,但返回的是mapper函數(shù)所返回的Optional對象本身

3.2 案例

下面是一個Java案例程序,演示了如何使用上述每個方法:

import java.util.NoSuchElementException;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.function.Supplier;

public class OptionalExample {
    public static void main(String[] args) {
        // 定義字符串
        String value1 = "Hello, world!";
        String value2 = null;

        // 1、創(chuàng)建Optional對象,并將字符串作為包裝值
        Optional<String> optional1 = Optional.ofNullable(value1);
        Optional<String> nullOpt = Optional.ofNullable(value2);
        
        // 2、創(chuàng)建Optional對象,并將字符串作為包裝值。注意這種方式下,value不能為null,否則會拋出NullPointerException
        Optional<String> optional2 = Optional.of("Hello, Java!");
        //value為null,會拋出NullPointerException
        try {
            nullOpt = Optional.of(value2);
        }catch (NullPointerException e){
            System.out.println(e);
        }

        // 3、創(chuàng)建一個空的Optional對象
        Optional<String> optional = Optional.empty();
        System.out.println("\n" + optional);
        
        // 4、判斷Optional對象是否包含非空值
        System.out.println("\nIs optional1 present? " + optional1.isPresent());
        System.out.println("Is nullOpt present? " + nullOpt.isPresent());
        
        // 5、獲取Optional對象中的值,如果不存在則拋出NoSuchElementException異常
        String result1 = optional1.get();
        System.out.println("\nValue of optional1: " + result1);
        try {
            String tempResult = nullOpt.get();
            System.out.println("Value of nullOpt: " + tempResult);
        }catch (NoSuchElementException e){
            System.out.println(e);
        }

        // 6、獲取Optional對象的值,若不存在則返回指定的默認值
        String result2 = optional2.orElse("Default Value");
        System.out.println("\nValue of optional2: " + result2);
        String defaultResult = nullOpt.orElse("Default Value");
        System.out.println("Value of nullOpt: " + defaultResult);

        // 7、獲取Optional對象的值,若不存在則使用提供的Supplier生成一個新值
        Supplier<? extends String> other = () -> "Generated Value";
        String result3 = optional2.orElseGet(other);
        System.out.println("\nValue of optional2: " + result3);
        String generatedResult = nullOpt.orElseGet(other);
        System.out.println("Value of nullOpt: " + generatedResult);
        
        // 8、根據(jù)條件過濾Optional對象,返回滿足條件的Optional對象
        Predicate<? super String> predicate = s -> s.length() > 10;
        Optional<String> filteredOptional = optional1.filter(predicate);
        System.out.println("\nFiltered optional1: " + filteredOptional);
        filteredOptional = nullOpt.filter(predicate);
        System.out.println("Filtered nullOpt: " + filteredOptional);
        
        // 9、將Optional對象中的值轉(zhuǎn)換為mapper函數(shù)的結(jié)果,并返回新的Optional對象
        Optional<Integer> lengthOptional = optional1.map(String::length);
        System.out.println("\nLength of optional1: " + lengthOptional.orElse(0));
        
        // 10、類似map操作,返回的是mapper函數(shù)所返回的Optional對象本身
        Optional<String> flatMappedOptional = optional1.flatMap(s -> Optional.of(s.toUpperCase()));
        System.out.println("\nFlattened and mapped optional1: " + flatMappedOptional.orElse(""));
        
        // 11、如果Optional對象包含值,則執(zhí)行傳入的操作
        System.out.println();
        optional2.ifPresent(System.out::println);

        // 12、獲取Optional對象的值,若不存在則拋出自定義的異常
        try {
            String result = optional.orElseThrow(() -> new Exception("Exception: Value is not present"));
            System.out.println("\nValue of optional: " + result);
        }catch (Exception e) {
            System.out.println("\n" + e.getMessage());
        }
    }
}

運行結(jié)果如下:

java.lang.NullPointerException

Optional.empty

Is optional1 present? true
Is nullOpt present? false

Value of optional1: Hello, world!
java.util.NoSuchElementException: No value present

Value of optional2: Hello, Java!
Value of nullOpt: Default Value

Value of optional2: Hello, Java!
Value of nullOpt: Generated Value

Filtered optional1: Optional[Hello, world!]
Filtered nullOpt: Optional.empty

Length of optional1: 13

Flattened and mapped optional1: HELLO, WORLD!

Hello, Java!

Exception: Value is not present

3.3 使用技巧

使用Optional 時可以考慮以下幾點優(yōu)化技巧:

  1. 盡量不要在方法參數(shù)或返回類型中使用 OptionalOptional主要用于局部變量和字段,以表明其可能為空;
  2. 盡量避免使用optional.get()方法獲取 Optional 對象的值,可以使用ifPresent()orElse()等更安全的方法來處理值的情況;
  3. 謹慎使用嵌套Optional,避免過度復(fù)雜化邏輯。

4?? 應(yīng)用場景

常見的應(yīng)用場景包括:

  • 避免null處理:Optional可以使得代碼更加清晰明確,避免因為忽略處理空值而導(dǎo)致空指針異常;
  • 方法返回值:用于替代可能為空的返回值,以便提供更好的可讀性;
  • 鏈式調(diào)用:通過一系列的Optional操作,可以進行連續(xù)且安全的調(diào)用鏈。

結(jié)合實際生產(chǎn)應(yīng)用來說,Optional在以下業(yè)務(wù)場景可以發(fā)揮重要的作用:

  • 處理外部API調(diào)用,當(dāng)返回值可能為空時使用Optional來封裝;
  • 解析JSON對象時,若某些字段為可選字段,可使用Optional來處理;
  • 在數(shù)據(jù)庫查詢中,如果結(jié)果可能為空,可以使用Optional處理。

5?? 實現(xiàn)原理

Optional類是一個常規(guī)的、泛型化的類,通過包裝值的方式來處理可能為空的情況。它采用了一些與空對象模式相關(guān)的思想,Optional類提供了一組豐富的操作方法,以便更方便地處理可選值,避免了使用空對象時的空指針異常。

Optional類的設(shè)計靈感之一可以類比為空對象模式(Null Object Pattern)。
在空對象模式中,需要處理某個操作的對象可能為空,而使用空對象作為代替,以避免空指針異常。
對于Optional類來說,當(dāng)value字段為null時,表示該Optional對象為空,它也被視作特殊的空對象。

Optional類內(nèi)部有一個私有字段value,用于存儲包裝的值。value字段的類型是泛型T,即可以是任何類型的值。如果Optional對象包含一個非空值,則value字段存儲這個值;如果Optional對象為空,則value字段為null。

?? 總結(jié)

Optional類是Java 8引入的強大工具,用于解決空值處理問題。它可以用于包裝可能為空的引用,提供一種更優(yōu)雅且可讀性更高的方式來表示和處理可能為空的值。使用Optional類,我們可以明確表達值是可空的,并通過一系列簡單的操作方法來避免潛在的空指針異常。

盡管Optional并不適用于所有情況,但在正確的場景下,它可以大大提高代碼的可讀性和可維護性。然而,需要謹慎使用Optional,避免過度使用,以免引入額外的復(fù)雜性。了解Optional的基礎(chǔ)和高級語法、Java操作API以及實現(xiàn)原理等方面的知識,將有助于正確地應(yīng)用和優(yōu)化Optional,從而編寫更穩(wěn)健的Java代碼。


? 溫習(xí)回顧上一篇(點擊跳轉(zhuǎn))《【Java基礎(chǔ)教程】(三十)Java新特性篇 · 第十講: Stream流——釋放流式編程的效率與優(yōu)雅,狂肝萬字只為透徹講清 Stream流!~》

? 繼續(xù)閱讀下一篇(點擊跳轉(zhuǎn))《【Java基礎(chǔ)教程】(三十二)常用類庫篇 · 第二講:包裝類 Wrapper Class——概念及用途, 自動裝箱與拆箱,常用操作方法~》
文章來源地址http://www.zghlxwxcb.cn/news/detail-606004.html

【Java基礎(chǔ)教程】(三十一)常用類庫篇 · 第一講:Optional類——解鎖Java的Optional操作,消滅那些隱匿的空指針,還程序世界一個安穩(wěn)!~,# Java基礎(chǔ)教程,java,開發(fā)語言,數(shù)據(jù)庫,后端,java-ee,jvm

到了這里,關(guān)于【Java基礎(chǔ)教程】(三十一)常用類庫篇 · 第一講:Optional類——解鎖Java的Optional操作,消滅那些隱匿的空指針,還程序世界一個安穩(wěn)!~的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【Java基礎(chǔ)教程】(三十七)常用類庫篇 · 第七講:日期時間處理類——三萬字全面講解 LocalDateTime和 DateTimeFormatter,Date、Calendar ~

    【Java基礎(chǔ)教程】(三十七)常用類庫篇 · 第七講:日期時間處理類——三萬字全面講解 LocalDateTime和 DateTimeFormatter,Date、Calendar ~

    Java的時間處理相關(guān)類主要是為了提供靈活、可靠地處理日期和時間的能力,以滿足各種應(yīng)用程序中對時間的需求。這些類旨在簡化日期和時間的操作,并提供一致的方法和功能來處理時間上的計算、格式化和解析。 ?? 時間日期及處理類匯總 將Java中所有用于表示日期時間的

    2024年02月16日
    瀏覽(36)
  • 【Java練習(xí)題匯總】《第一行代碼JAVA》Java常用類庫篇,匯總Java練習(xí)題——Optional類、包裝類、可變字符串支持類、Runtime類、System類、數(shù)學(xué)運算類、日期時間處理...

    【Java練習(xí)題匯總】《第一行代碼JAVA》Java常用類庫篇,匯總Java練習(xí)題——Optional類、包裝類、可變字符串支持類、Runtime類、System類、數(shù)學(xué)運算類、日期時間處理...

    一、填空題 在 java.lang 包中提供了兩個字符串類,分別是________ 和________ 。這兩個類都是________ 接口的子類,字符串類提供的求字符串長度的方法是________________ 。 Java 提供的兩個大數(shù)操作類是________ 和________ 。 對象克隆方法是________ 類提供的,方法名稱是________________ ,對

    2024年02月16日
    瀏覽(37)
  • 【JavaSE】Java基礎(chǔ)語法(三十一):可變參數(shù)

    【JavaSE】Java基礎(chǔ)語法(三十一):可變參數(shù)

    可變參數(shù)介紹 可變參數(shù)又稱參數(shù)個數(shù)可變,用作方法的形參出現(xiàn),那么方法參數(shù)個數(shù)就是可變的了 方法的參數(shù)類型已經(jīng)確定,個數(shù)不確定,我們可以使用可變參數(shù) 可變參數(shù)定義格式 可變參數(shù)的注意事項 這里的變量其實是一個數(shù)組 如果一個方法有多個參數(shù),包含可變參數(shù),可

    2024年02月08日
    瀏覽(22)
  • 第四十一天 Java基礎(chǔ)學(xué)習(xí)(三十五)

    一、JSP內(nèi)置對象 ●內(nèi)置對象 因為SP的本質(zhì)是Servlet,在JSP文件經(jīng)過轉(zhuǎn)譯之后,生成JAVA代碼,在運行時JSP給我們準備好了九個可以直接使用而不用我們自己去new的對象,這九個對象我之為內(nèi)置對象. 內(nèi)置對象完全由SP自行去維護,我們直接使用即可。 ●九大內(nèi)置對象 confia ;page ;

    2024年02月16日
    瀏覽(20)
  • 【Java零基礎(chǔ)入門篇】第 ⑦ 期 - 常用類庫

    【Java零基礎(chǔ)入門篇】第 ⑦ 期 - 常用類庫

    博主:命運之光 專欄:Java零基礎(chǔ)入門 ? 學(xué)習(xí)目標(biāo) 掌握Java各種常用類庫的使用方法。 目錄 Java類庫 字符串String String 概述 創(chuàng)建字符串對象的2種方式 String類的特點 創(chuàng)建字符串對象的2種方式 總結(jié):創(chuàng)建字符串對象的2種方式區(qū)別 字符串的比較 字符串的比較 String類其它常用

    2024年02月04日
    瀏覽(23)
  • ElasticSearch7.3學(xué)習(xí)(三十一)----Logstash基礎(chǔ)學(xué)習(xí)

    ElasticSearch7.3學(xué)習(xí)(三十一)----Logstash基礎(chǔ)學(xué)習(xí)

    一、Logstash基本介紹 Logstash 是一個功能強大的工具,可與各種部署集成。 它提供了大量插件,可幫助你解析,豐富,轉(zhuǎn)換和緩沖來自各種來源的數(shù)據(jù)(文件、數(shù)據(jù)庫......)。logstash簡單來說就是一個 數(shù)據(jù)抽取工具 ,將數(shù)據(jù)從一個地方轉(zhuǎn)移到另一個地方。 Logstash 是 Elastic 棧非

    2023年04月09日
    瀏覽(26)
  • 【前端知識】React 基礎(chǔ)鞏固(三十一)——Redux的簡介

    概念 純函數(shù)(確定的輸入一定產(chǎn)生確定的輸出,函數(shù)在執(zhí)行過程中不產(chǎn)生副作用): 在程序設(shè)計中,若一個函數(shù)符合以下條件,那么這個函數(shù)就被稱為純函數(shù) 此函數(shù)在相同的輸入值時,需產(chǎn)生相同的輸出 函數(shù)的輸出和輸入值以外的其他隱藏信息或狀態(tài)無關(guān),也和由I/O設(shè)備產(chǎn)

    2024年02月16日
    瀏覽(24)
  • Java常用類庫與技巧

    Java常用類庫與技巧

    序號 地址 1 計算機網(wǎng)絡(luò)核心 2 數(shù)據(jù)庫相關(guān) 3 Redis 4 Linux相關(guān) 5 JVM的內(nèi)容 6 GC相關(guān)的 7 Java多線程與并發(fā) 8 Java多線程與并發(fā)-原理 9 Java常用類庫與技巧 10 Java框架-Spring 1、String,StringBuffer,StringBuilder的區(qū)別? 2、Java異常 異常處理機制主要回答了三個問題 What:異常類型回答了什么

    2024年02月10日
    瀏覽(47)
  • Hadoop3教程(三十一):(生產(chǎn)調(diào)優(yōu)篇)異構(gòu)存儲

    Hadoop3教程(三十一):(生產(chǎn)調(diào)優(yōu)篇)異構(gòu)存儲

    異構(gòu)存儲,也叫做冷熱數(shù)據(jù)分離 。其中,經(jīng)常使用的數(shù)據(jù)被叫做是熱數(shù)據(jù),不經(jīng)常使用的數(shù)據(jù)被叫做冷數(shù)據(jù)。 把冷熱數(shù)據(jù),分別存儲在不同的存儲介質(zhì)里,從而達到對每個介質(zhì)的利用率最高,從而實現(xiàn)整體最佳性能,或者說性價比更高(比如說高性能硬盤放經(jīng)常使用的數(shù)據(jù)

    2024年02月08日
    瀏覽(22)
  • vue 3 第三十一章:狀態(tài)管理(Pinia基礎(chǔ)知識)

    狀態(tài)管理是現(xiàn)代 Web 應(yīng)用開發(fā)中的一個重要概念。Vue 3 中的狀態(tài)管理庫 Pinia ,是一個基于 Vue 3 Composition API 的狀態(tài)管理庫,它提供了一種 簡單 、 靈活 的方式來管理應(yīng)用程序的狀態(tài),同時還具有 高性能 和 可擴展性 。 Pinia 在某種程度上來說,也可以被叫做 Vuex5 ,因為它結(jié)合

    2024年02月07日
    瀏覽(292)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包