Java8 的 其他新特性

Optional 類

Optional 類(java.util.Optional) 是一個(gè)容器類放钦,代表一個(gè)值存在或不存在供填, 原來(lái)用 null 表示一個(gè)值不存在蟆技,現(xiàn)在 Optional 可以更好的表達(dá)這個(gè)概念留潦。并且 可以避免空指針異常豹芯。

常用方法:

  • Optional.of(T t) : 創(chuàng)建一個(gè) Optional 實(shí)例
  • Optional.empty() : 創(chuàng)建一個(gè)空的 Optional 實(shí)例
  • Optional.ofNullable(T t):若 t 不為 null,創(chuàng)建 Optional 實(shí)例,否則創(chuàng)建空實(shí)例
  • isPresent() : 判斷是否包含值
  • orElse(T t) : 如果調(diào)用對(duì)象包含值罚拟,返回該值台诗,否則返回t
  • orElseGet(Supplier s) :如果調(diào)用對(duì)象包含值,返回該值赐俗,否則返回 s 獲取的值
  • map(Function f): 如果有值對(duì)其處理拉队,并返回處理后的Optional,否則返回Optional.empty()
  • flatMap(Function mapper):與 map 類似阻逮,要求返回值必須是Optional

重復(fù)注解與類型注解

Java 8對(duì)注解處理提供了兩點(diǎn)改進(jìn):可重復(fù)的注解可用于類型的注解

image.png

代碼演示

####### Goddess

package com.www.java8.optional;

/**
 * <p>
 *
 * @author Www
 * <p>
 * 郵箱: 483223455@qq.com
 * <p>
 * 創(chuàng)建時(shí)間: 2022/8/15  17:28  星期一
 * <p>
 */
public class Goddess {
    private String name;
    
    public Goddess() {
    
    }
    
    public Goddess(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "Goddess{" +
                "name='" + name + '\'' +
                '}';
    }
}


####### Man

package com.www.java8.optional;

/**
 * <p>
 *
 * @author Www
 * <p>
 * 郵箱: 483223455@qq.com
 * <p>
 * 創(chuàng)建時(shí)間: 2022/8/15  17:28  星期一
 * <p>
 */
public class Man {
    private Goddess goddess;
    
    public Man(Goddess goddess) {
        this.goddess = goddess;
    }
    
    public Man() {
    }
    
    public Goddess getGoddess() {
        return goddess;
    }
    
    public void setGoddess(Goddess goddess) {
        this.goddess = goddess;
    }
    
    @Override
    public String toString() {
        return "Man{" +
                "goddess=" + goddess +
                '}';
    }
}

NewMan

package com.www.java8.optional;

import java.util.Optional;

/**
 * <p>
 *
 * @author Www
 * <p>
 * 郵箱: 483223455@qq.com
 * <p>
 * 創(chuàng)建時(shí)間: 2022/8/15  17:35  星期一
 * <p>
 */
public class NewMan {
    private Optional<Goddess> goddess= Optional.empty();
    
    public NewMan(Optional<Goddess> goddess) {
        this.goddess = goddess;
    }
    
    public NewMan() {
    }
    
    
    public Optional<Goddess> getGoddess() {
        return goddess;
    }
    
    public void setGoddess(Optional<Goddess> goddess) {
        this.goddess = goddess;
    }
    
    @Override
    public String toString() {
        return "NewMan{" +
                "goddess=" + goddess +
                '}';
    }
}

####### OptionalTest

package com.www.java8.optional;

import com.www.java8.entity.Employee;
import org.junit.Test;

import java.util.Optional;

/**
 * <p>
 *
 * @author Www
 * <p>
 * 郵箱: 483223455@qq.com
 * <p>
 * 創(chuàng)建時(shí)間: 2022/8/15  17:09  星期一
 * <p>
 */
public class OptionalTest {
    /**
     * Optional<T> 類(java.util.Optional) 是一個(gè)容器類粱快,代表一個(gè)值存在或不存在原來(lái)用 null 表示一個(gè)值不存在,現(xiàn)在 Optional 可以更好的表達(dá)這個(gè)概念叔扼。并且可以避免空指針異常事哭。
     * <p>
     * <p>
     * <p>
     * <p>
     * <p>
     * 常用方法:
     * <p>
     * <p>
     * Optional.of(T t) : 創(chuàng)建一個(gè) Optional 實(shí)例
     * <p>
     * Optional.empty() : 創(chuàng)建一個(gè)空的 Optional 實(shí)例
     * <p>
     * Optional.ofNullable(T t):若 t 不為 null,創(chuàng)建 Optional 實(shí)例,否則創(chuàng)建空實(shí)例
     * <p>
     * isPresent() : 判斷是否包含值
     * <p>
     * orElse(T t) : 如果調(diào)用對(duì)象包含值,返回該值瓜富,否則返回t
     * <p>
     * orElseGet(Supplier s) :如果調(diào)用對(duì)象包含值鳍咱,返回該值,否則返回 s 獲取的值
     * <p>
     * map(Function f): 如果有值對(duì)其處理与柑,并返回處理后的Optional谤辜,否則返回 Optional.empty()
     * <p>
     * flatMap(Function mapper):與 map 類似,要求返回值必須是Optional
     */
    @Test
    public void test() {
        Optional<Employee> employee = Optional.of(new Employee());
        //        Optional<Employee> employee = Optional.of(null);
        Employee employee1 = employee.get();
        System.out.println(employee1);
        
    }
    
    /**
     * 創(chuàng)建一個(gè)空的 Optional
     */
    @Test
    public void test1() {
        Optional<Object> empty = Optional.empty();
        System.out.println("empty.get() = " + empty.get());
    }
    
    /**
     *
     */
    @Test
    public void test2() {
        Optional<Employee> employee = Optional.ofNullable(null);
        if (employee.isPresent()) {
            System.out.println("employee.get() = " + employee.get());
        }
        
        Employee employee1 = employee.orElse(new Employee("12", 12, 21.3, Employee.Status.FREE));
        System.out.println(employee1);
        
        Employee employee2 = employee.orElseGet(() -> new Employee());
        System.out.println(employee2);
    }
    
    /**
     *
     */
    @Test
    public void test3() {
        Optional<Employee> employee = Optional.ofNullable(new Employee("12", 12, 21.3, Employee.Status.FREE));
        Optional<String> s = employee.map(Employee::getName);
        System.out.println(s.get());
        Optional<String> s1 = employee.flatMap(e -> Optional.ofNullable(e.getName()));
        System.out.println("s1 = " + s1.get());
        
    }
    
    /**
     *
     */
    @Test
    public void test4() {
        //        Man man = new Man();
        ////        //        String goddessName = getGoddessName(man);
        //        System.out.println(goddessName);
        Optional<Goddess> gn = Optional.ofNullable(null);
        Optional<NewMan> newMan = Optional.ofNullable(new NewMan(gn));
        String goddessNewMan = getGoddessNewMan(newMan);
        System.out.println("goddessNewMan = " + goddessNewMan);
    }
    
    /**
     * 獲取 Goddess 的名字
     *
     * @param man
     * @return
     */
    private String getGoddessName(Man man) {
        return man.getGoddess().getName();
    }
    
    
    private String getGoddessNewMan(Optional<NewMan> newMan) {
        return newMan.orElse(new NewMan())
                .getGoddess()
                .orElse(new Goddess("w"))
                .getName();
    }
    
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末价捧,一起剝皮案震驚了整個(gè)濱河市丑念,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌结蟋,老刑警劉巖脯倚,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嵌屎,居然都是意外死亡推正,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)宝惰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舔稀,“玉大人,你說(shuō)我怎么就攤上這事掌测。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵汞斧,是天一觀的道長(zhǎng)夜郁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)粘勒,這世上最難降的妖魔是什么竞端? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮庙睡,結(jié)果婚禮上事富,老公的妹妹穿的比我還像新娘。我一直安慰自己乘陪,他們只是感情好统台,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著啡邑,像睡著了一般贱勃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谤逼,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天贵扰,我揣著相機(jī)與錄音,去河邊找鬼流部。 笑死戚绕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的枝冀。 我是一名探鬼主播舞丛,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宾茂!你這毒婦竟也來(lái)了瓷马?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤跨晴,失蹤者是張志新(化名)和其女友劉穎欧聘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體端盆,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怀骤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了焕妙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蒋伦。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖焚鹊,靈堂內(nèi)的尸體忽然破棺而出痕届,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布研叫,位于F島的核電站锤窑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嚷炉。R本人自食惡果不足惜渊啰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望申屹。 院中可真熱鬧绘证,春花似錦、人聲如沸哗讥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忌栅。三九已至车酣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間索绪,已是汗流浹背湖员。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瑞驱,地道東北人娘摔。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像唤反,于是被迫代替她去往敵國(guó)和親凳寺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • java8新特性 原創(chuàng)者:文思 一彤侍、特性簡(jiǎn)介 速度更快 代碼更少肠缨,增加了Lambda 強(qiáng)大的Stream API ...
    文思li閱讀 3,047評(píng)論 1 1
  • 一、Lambda表達(dá)式 Lambda表達(dá)式引入了一個(gè)新的操作符" -> "盏阶。Lambda表達(dá)式將函數(shù)當(dāng)成參數(shù)傳遞給...
    逝去丶淺秋閱讀 554評(píng)論 0 1
  • 為什么使用 Lambda 表達(dá)式 Lambda 是一個(gè)匿名函數(shù)晒奕,我們可以把 Lambda 表達(dá)式理解為是一段可以傳...
    強(qiáng)某某閱讀 14,804評(píng)論 0 15
  • 一、重要數(shù)據(jù)結(jié)構(gòu)和JVM的改動(dòng) 1.HashMap的改動(dòng) HashMap維護(hù)了一個(gè)Entry數(shù)組,put(K ke...
    一只愛(ài)java的貓閱讀 471評(píng)論 0 0
  • 1.Lamda表達(dá)式 Lambda表達(dá)式的作用主要是用來(lái)簡(jiǎn)化接口的創(chuàng)建名斟,使用Lambda表達(dá)式接口必須是函數(shù)式接口...
    影風(fēng)揚(yáng)閱讀 369評(píng)論 0 0