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

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

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

Optional類的使用

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

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

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

這個(gè)Optional類注意是解決空指針的問題

1. 以前對(duì)null 的處理

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

    }

2. Optional類

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

在這里插入圖片描述

3. Optional的基本使用

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

/**
     * Optional對(duì)象的創(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)建一個(gè)空的Optional對(duì)象
        Optional<Object> op5 = Optional.empty();

    }

4. Optional的常用方法

/**
     * Optional中的常用方法介紹
     *   get(): 如果Optional有值則返回,否則拋出NoSuchElementException異常
     *          get()通常和isPresent方法一塊使用
     *   isPresent():判斷是否包含值,包含值返回true,不包含值返回false
     *   orElse(T t):如果調(diào)用對(duì)象包含值,就返回該值,否則返回t
     *   orElseGet(Supplier s):如果調(diào)用對(duì)象包含值,就返回該值,否則返回 Lambda表達(dá)式的返回值
     */
    @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是一個(gè)空Optional對(duì)象");
        }

        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);
    }

    /**
     * 自定義一個(gè)方法,將Person對(duì)象中的 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對(duì)象 將name轉(zhuǎn)換為大寫并返回
     *    通過Optional方式實(shí)現(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對(duì)象 將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真的很簡(jiǎn)單,其實(shí)大家只要了解了它在工作中還是蠻有用的

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

相關(guān)文章

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

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

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

    springmvc+maven搭建web項(xiàng)目

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

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

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

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

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

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

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

    繼承jpa?Repository?寫自定義方法查詢實(shí)例

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

    java Object wait方法詳細(xì)介紹

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

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

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

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

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

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

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

最新評(píng)論