欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JDK8中新增的Optional工具類基本使用

 更新時間:2021年06月08日 11:03:54   作者:波波烤鴨  
Optional不是對null關(guān)鍵字的一種替代,而是對于null判定提供了一種更加優(yōu)雅的實現(xiàn),接下來通過本文給大家分享JDK8中新增的Optional工具類基本使用,感興趣的朋友跟隨小編一起看看吧

Optional類的使用

      JDK8以前,編寫代碼,通常會出現(xiàn) NullPointerException (空指針異常),通常情況下我們都是通過 if ... else... 來對對象進行為空判斷,然后再進行邏輯處理,代碼寫起來也比較冗余。

      JDK8新增了Optional類,使用該類可以避免我們對空指針的檢查,使代碼看起來比較優(yōu)雅。

  最近剛好有空給大家整理下JDK8的特性,這個在實際開發(fā)中的作用也是越來越重了,本文重點講解下Optional

這個Optional類注意是解決空指針的問題

1. 以前對null 的處理

  @Test
    public void test01(){
        //String userName = "張三";
        String userName = null;
        if(userName != null){
            System.out.println("字符串的長度:" + userName.length());
        }else{
            System.out.println("字符串為空");
        }

    }

2. Optional類

Optional是一個沒有子類的工具類,Optional是一個可以為null的容器對象,它的主要作用就是為了避免Null檢查,防止NullpointerException,

在這里插入圖片描述

3. Optional的基本使用

Optional對象的創(chuàng)建方式

/**
     * Optional對象的創(chuàng)建方式
     */
    @Test
    public void test02(){
        // 第一種方式 通過of方法  of方法是不支持null的
        Optional<String> op1 = Optional.of("zhangsan");
        //Optional<Object> op2 = Optional.of(null);

        // 第二種方式通過 ofNullable方法 支持null
        Optional<String> op3 = Optional.ofNullable("lisi");
        Optional<Object> op4 = Optional.ofNullable(null);

        // 第三種方式 通過empty方法直接創(chuàng)建一個空的Optional對象
        Optional<Object> op5 = Optional.empty();

    }

4. Optional的常用方法

/**
     * Optional中的常用方法介紹
     *   get(): 如果Optional有值則返回,否則拋出NoSuchElementException異常
     *          get()通常和isPresent方法一塊使用
     *   isPresent():判斷是否包含值,包含值返回true,不包含值返回false
     *   orElse(T t):如果調(diào)用對象包含值,就返回該值,否則返回t
     *   orElseGet(Supplier s):如果調(diào)用對象包含值,就返回該值,否則返回 Lambda表達式的返回值
     */
    @Test
    public void test03(){
        Optional<String> op1 = Optional.of("zhangsan");
        Optional<String> op2 = Optional.empty();

        // 獲取Optional中的值
        if(op1.isPresent()){
            String s1 = op1.get();
            System.out.println("用戶名稱:" +s1);
        }

        if(op2.isPresent()){
            System.out.println(op2.get());
        }else{
            System.out.println("op2是一個空Optional對象");
        }

        String s3 = op1.orElse("李四");
        System.out.println(s3);
        String s4 = op2.orElse("王五");
        System.out.println(s4);

        String s5 = op2.orElseGet(()->{
            return "Hello";
        });
        System.out.println(s5);
    }
@Test
    public void test04(){
        Optional<String> op1 = Optional.of("zhangsan");
        Optional<String> op2 = Optional.empty();
        // 如果存在值 就做什么
        op1.ifPresent(s-> System.out.println("有值:" +s));
        op1.ifPresent(System.out::println);
    }

    /**
     * 自定義一個方法,將Person對象中的 name 轉(zhuǎn)換為大寫 并返回
     */
    @Test
    public void test05(){
        Person p = new Person("zhangsan",18);
        Optional<Person> op = Optional.of(p);
        String name = getNameForOptional(op);
        System.out.println("name="+name);

    }

    /**
     * 根據(jù)Person對象 將name轉(zhuǎn)換為大寫并返回
     *    通過Optional方式實現(xiàn)
     * @param op
     * @return
     */
    public String getNameForOptional(Optional<Person> op){
       if(op.isPresent()){
           String msg = //op.map(p -> p.getName())
                   op.map(Person::getName)
                   //.map(p -> p.toUpperCase())
                   .map(String::toUpperCase)
                   .orElse("空值");
           return msg;
       }
       return null;
    }

    /**
     * 根據(jù)Person對象 將name轉(zhuǎn)換為大寫并返回
     * @param person
     * @return
     */
    public String getName(Person person){
        if(person != null){
            String name = person.getName();
            if(name != null){
                return name.toUpperCase();
            }else{
                return null;
            }
        }else{
            return null;
        }
    }

~好了,Optional真的很簡單,其實大家只要了解了它在工作中還是蠻有用的

以上就是JDK8中新增的Optional工具類基本使用的詳細內(nèi)容,更多關(guān)于JDK8 Optional工具類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IntelliJ IDEA 老司機居然還沒用過 Stream Trace功能(問題小結(jié))

    IntelliJ IDEA 老司機居然還沒用過 Stream Trace功能(問題小結(jié))

    很多朋友酷愛Java8 Stream功能,但是在使用過程中總不是那么順利,下面通過本文給大家分享idea Stream Trace調(diào)試過程遇到的問題,需要的朋友參考下吧
    2021-05-05
  • springmvc+maven搭建web項目

    springmvc+maven搭建web項目

    這篇文章主要為大家詳細介紹了springmvc+maven搭建web項目的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 解決Spring?Boot應(yīng)用打包后文件訪問問題

    解決Spring?Boot應(yīng)用打包后文件訪問問題

    在Spring Boot項目的開發(fā)過程中,一個常見的挑戰(zhàn)是如何有效地訪問和操作資源文件,本文就來介紹一下解決Spring?Boot應(yīng)用打包后文件訪問問題,感興趣的可以了解一下
    2024-01-01
  • SpringBoot+MyBatis-Plus實現(xiàn)數(shù)據(jù)庫讀寫分離的代碼示例

    SpringBoot+MyBatis-Plus實現(xiàn)數(shù)據(jù)庫讀寫分離的代碼示例

    在當今互聯(lián)網(wǎng)應(yīng)用中,數(shù)據(jù)庫讀寫分離是提高系統(tǒng)性能和穩(wěn)定性的重要手段之一,通過將讀操作和寫操作分別路由到不同的數(shù)據(jù)庫節(jié)點,可以有效減輕數(shù)據(jù)庫服務(wù)器的負擔(dān),本文將介紹如何利用SpringBoot和MyBatis-Plus框架實現(xiàn)數(shù)據(jù)庫讀寫分離,需要的朋友可以參考下
    2023-11-11
  • javaweb設(shè)計中filter粗粒度權(quán)限控制代碼示例

    javaweb設(shè)計中filter粗粒度權(quán)限控制代碼示例

    這篇文章主要介紹了javaweb設(shè)計中filter粗粒度權(quán)限控制代碼示例,小編覺得還是挺不錯的,需要的朋友可以參考。
    2017-10-10
  • 繼承jpa?Repository?寫自定義方法查詢實例

    繼承jpa?Repository?寫自定義方法查詢實例

    這篇文章主要介紹了繼承jpa?Repository?寫自定義方法查詢實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • java Object wait方法詳細介紹

    java Object wait方法詳細介紹

    這篇文章主要介紹了java Object wait方法詳細介紹的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • java多線程中的生產(chǎn)者和消費者隊列詳解

    java多線程中的生產(chǎn)者和消費者隊列詳解

    這篇文章主要介紹了java多線程中的生產(chǎn)者和消費者隊列詳解,隊列,是一種數(shù)據(jù)結(jié)構(gòu),除了優(yōu)先級隊列和LIFO隊列外,隊列都是以FIFO(先進先出)的方式對各個元素進行排序的,需要的朋友可以參考下
    2024-01-01
  • Java復(fù)雜鏈表的復(fù)制詳解

    Java復(fù)雜鏈表的復(fù)制詳解

    復(fù)雜鏈表指的是一個鏈表有若干個結(jié)點,每個結(jié)點有一個數(shù)據(jù)域用于存放數(shù)據(jù),還有兩個指針域,其中一個指向下一個節(jié)點,還有一個隨機指向當前復(fù)雜鏈表中的任意一個節(jié)點或者是一個空結(jié)點,我們來探究一下在Java中復(fù)雜鏈表的復(fù)制
    2022-01-01
  • 關(guān)于springboot中的SPI機制

    關(guān)于springboot中的SPI機制

    這篇文章主要介紹了springboot中的SPI機制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論