java8新特性,你有用起來了嗎势决?(精編)

2019年9月19日java13已正式發(fā)布阻塑,感嘆java社區(qū)強(qiáng)大,經(jīng)久不衰果复。由于國內(nèi)偏保守陈莽,新東西總要放一放,讓其他人踩踩坑虽抄,等穩(wěn)定了才會(huì)去用走搁。并且企業(yè)目的還是賺錢,更不會(huì)因?yàn)橐粋€(gè)新特性去重構(gòu)代碼极颓,再開發(fā)一套程序出來朱盐。甚者國內(nèi)大多傳統(tǒng)企業(yè)還在用java4 、5菠隆、6…


今天講一講 java8 的新特性兵琳,Java 8 (又稱為 jdk 1.8) 是 Java 語言開發(fā)的一個(gè)主要版本。Oracle 公司于 2014 年 3 月 18 日發(fā)布 Java 8 骇径,它支持函數(shù)式編程躯肌,新的日期 API,新的Stream API 等破衔。是Java5之后一個(gè)大的版本升級(jí)清女,讓Java語言和庫仿佛獲得了新生,核心新特性包含:

  • Java8 函數(shù)式接口? 函數(shù)式接口(Functional Interface)就是一個(gè)有且僅有一個(gè)抽象方法,但是可以有多個(gè)非抽象方法的接口晰筛。函數(shù)式接口可以被隱式轉(zhuǎn)換為 lambda 表達(dá)式嫡丙。

  • Lambda 表達(dá)式 ? Lambda 允許把函數(shù)作為一個(gè)方法的參數(shù)(函數(shù)作為參數(shù)傳遞到方法中)。

  • 默認(rèn)方法 ? 默認(rèn)方法就是一個(gè)在接口里面有了一個(gè)實(shí)現(xiàn)的方法读第。

  • 方法引用 ? 方法引用提供了非常有用的語法曙博,可以直接引用已有Java類或?qū)ο螅▽?shí)例)的方法或構(gòu)造器。與lambda聯(lián)合使用怜瞒,方法引用可以使語言的構(gòu)造更緊湊簡潔父泳,減少冗余代碼。

  • Stream API ?新添加的Stream API(java.util.stream) 把真正的函數(shù)式編程風(fēng)格引入到Java中。

  • Date Time API ? 加強(qiáng)對日期與時(shí)間的處理惠窄。

  • Optional 類 ? Optional 類已經(jīng)成為 Java 8 類庫的一部分蒸眠,用來解決空指針異常。


一. 函數(shù)式接口

函數(shù)式接口(Functional Interface)就是一個(gè)有且僅有一個(gè)抽象方法杆融,但是可以有多個(gè)非抽象方法的接口楞卡。
函數(shù)式接口可以被隱式轉(zhuǎn)換為 lambda 表達(dá)式。

JDK 1.8 之前已有的函數(shù)式接口:

java.lang.Runnable
java.util.concurrent.Callable
java.security.PrivilegedAction
java.util.Comparator
java.io.FileFilter
java.nio.file.PathMatcher
java.lang.reflect.InvocationHandler
java.beans.PropertyChangeListener
java.awt.event.ActionListener
javax.swing.event.ChangeListener

JDK 1.8 新增加的函數(shù)接口:

java.util.function

這里說一下@FunctionalInterface注解擒贸,這個(gè)注解是java8新出得一個(gè)注解臀晃。

我們常用的一些接口Callable、Runnable介劫、Comparator等在JDK8中都添加了@FunctionalInterface注解徽惋。


在這里插入圖片描述

追蹤源碼查看@FunctionalInterface注解javadoc

在這里插入圖片描述

通過JDK8源碼javadoc,可以知道這個(gè)注解有以下特點(diǎn):

  • 該注解只能標(biāo)記在”有且僅有一個(gè)抽象方法”的接口上座韵。

  • JDK8接口中的靜態(tài)方法和默認(rèn)方法险绘,都不算是抽象方法。

  • 接口默認(rèn)繼承Java.lang.Object誉碴,所以如果接口顯示聲明覆蓋了Object中方法宦棺,那么也不算抽象方法。

  • 該注解不是必須的黔帕,如果一個(gè)接口符合”函數(shù)式接口”定義代咸,那么加不加該注解都沒有影響。加上該注解能夠更好地讓編譯器進(jìn)行檢查成黄。如果編寫的不是函數(shù)式接口呐芥,但是加上了@FunctionInterface,那么編譯器會(huì)報(bào)錯(cuò)奋岁。

@FunctionalInterface標(biāo)記在接口上思瘟,“函數(shù)式接口”是指僅僅只包含一個(gè)抽象方法的接口。


在這里插入圖片描述

如果一個(gè)接口中包含不止一個(gè)抽象方法闻伶,那么不能使用@FunctionalInterface滨攻,編譯會(huì)報(bào)錯(cuò)。

在這里插入圖片描述

比如下面這個(gè)接口就是一個(gè)正確的函數(shù)式接口:


在這里插入圖片描述

二. 默認(rèn)方法

簡單說蓝翰,默認(rèn)方法就是接口可以有實(shí)現(xiàn)方法光绕,而且不需要實(shí)現(xiàn)類去實(shí)現(xiàn)其方法。

我們只需在方法名前面加個(gè) default 關(guān)鍵字即可實(shí)現(xiàn)默認(rèn)方法畜份。

為什么要有這個(gè)特性奇钞?

首先,之前的接口是個(gè)雙刃劍漂坏,好處是面向抽象而不是面向具體編程,缺陷是,當(dāng)需要修改接口時(shí)候顶别,需要修改全部實(shí)現(xiàn)該接口的類谷徙,目前的 java 8 之前的集合框架沒有 foreach 方法,通常能想到的解決辦法是在JDK里給相關(guān)的接口添加新的方法及實(shí)現(xiàn)驯绎。然而完慧,對于已經(jīng)發(fā)布的版本,是沒法在給接口添加新方法的同時(shí)不影響已有的實(shí)現(xiàn)剩失。所以引進(jìn)的默認(rèn)方法屈尼。他們的目的是為了解決接口的修改與現(xiàn)有的實(shí)現(xiàn)不兼容的問題。

這里值得注意的是拴孤,我們知道java中一個(gè)類可以實(shí)現(xiàn)多個(gè)接口 如果多個(gè)接口中有同名同參同返回值得默認(rèn)方法需要我們在實(shí)現(xiàn)類重寫該方法脾歧,否則會(huì)編譯報(bào)錯(cuò)。


三. lambda表達(dá)式

這是java8的一大重要特性演熟,我們知道java是面向?qū)ο笳Z言鞭执,把行為封裝成一個(gè)對象是我們根深蒂固的java編程思想,但是lambda正好反其道而行之芒粹,是一種面向過程的編程思想兄纺。

不在贅述更多模糊,概念的含義化漆,大家現(xiàn)在有這樣的一個(gè)認(rèn)識(shí)就可以了估脆。下面我會(huì)用例子帶入大家。
能夠接收Lambda表達(dá)式的參數(shù)類型,是一個(gè)有且僅有一個(gè)抽象方法座云,但是可以有多個(gè)非抽象方法的接口疙赠。“函數(shù)接口”疙教」琢模可以頂替匿名內(nèi)部類。

語法:

(parameters) -> expression或(parameters) ->{ statements; }

以下是lambda表達(dá)式的重要特征:

  • 可選類型聲明:不需要聲明參數(shù)類型贞谓,編譯器可以統(tǒng)一識(shí)別參數(shù)值限佩。

  • 可選的參數(shù)圓括號(hào):一個(gè)參數(shù)無需定義圓括號(hào),但多個(gè)參數(shù)需要定義圓括號(hào)裸弦。

  • 可選的大括號(hào):如果主體包含了一個(gè)語句祟同,就不需要使用大括號(hào)。

  • 可選的返回關(guān)鍵字:如果主體只有一個(gè)表達(dá)式返回值則編譯器會(huì)自動(dòng)返回值理疙,大括號(hào)需要指定明表達(dá)式返回了一個(gè)數(shù)值晕城。

老版本Java中排列字符串


Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

只需要給靜態(tài)方法 Collections.sort 傳入一個(gè)List對象以及一個(gè)比較器來按指定順序排列。通常做法都是創(chuàng)建一個(gè)匿名的比較器對象然后將其傳遞給sort方法窖贤。

在Java 8 中你就沒必要使用這種傳統(tǒng)的匿名對象的方式了砖顷,直接上lambda

Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});

看到了吧贰锁,代碼變得更段且更具有可讀性,但是實(shí)際上還可以寫得更短:

Collections.sort(names, (String a, String b) -> b.compareTo(a));

對于函數(shù)體只有一行代碼的滤蝠,你可以去掉大括號(hào){}以及return關(guān)鍵字豌熄,但是你還可以寫得更短點(diǎn):

Collections.sort(names, (a, b) -> b.compareTo(a));

據(jù)官方文檔中介紹Java編譯器可以自動(dòng)推導(dǎo)出參數(shù)類型,可以不寫,但是這里我還是建議大家寫出參數(shù)類型物咳,方便代碼被其他人閱讀時(shí)候的可讀性锣险。自己反過來查看代碼也有幫助。

總結(jié):

缺點(diǎn) : 學(xué)習(xí)成本稍高览闰,剛開始接觸不容易理解芯肤,并需要反復(fù)練習(xí)。

<mark style="background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); box-sizing: border-box;">優(yōu)點(diǎn) : lambda表達(dá)式讓我們可以把一個(gè)方法當(dāng)成參數(shù)傳遞進(jìn)另一個(gè)方法压鉴,頂替匿名內(nèi)部類消除了樣板式代碼崖咨。并讓我們的代碼看起來更加簡潔厢岂、干凈嵌莉。</mark>

<mark style="background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); box-sizing: border-box;">并且lambda表達(dá)式可以在結(jié)合很多地方使用。下面涉及我會(huì)再分析寞忿∩暇希總的來說lambda表達(dá)式還是值得我們學(xué)習(xí)的际邻。</mark>


四. stream流

Java 8 API添加了一個(gè)新的抽象稱為流Stream,可以讓你以一種聲明的方式處理數(shù)據(jù)芍阎。

Stream 使用一種類似用 SQL 語句從數(shù)據(jù)庫查詢數(shù)據(jù)的直觀方式來提供一種對 Java 集合運(yùn)算和表達(dá)的高階抽象世曾。

Stream API可以極大提高Java程序員的生產(chǎn)力,讓程序員寫出高效率谴咸、干凈轮听、簡潔的代碼。

這種風(fēng)格將要處理的元素集合看作一種流岭佳, 流在管道中傳輸血巍, 并且可以在管道的節(jié)點(diǎn)上進(jìn)行處理, 比如篩選珊随, 排序述寡,聚合等。

元素流在管道中經(jīng)過中間操作(intermediate operation)的處理叶洞,最后由最終操作(terminal operation)得到前面處理的結(jié)果鲫凶。

什么是stream?

Stream(流)是一個(gè)來自數(shù)據(jù)源的元素隊(duì)列并支持聚合操作。

元素是特定類型的對象衩辟,形成一個(gè)隊(duì)列螟炫。Java中的Stream并不會(huì)存儲(chǔ)元素,而是按需計(jì)算艺晴。

數(shù)據(jù)源 流的來源昼钻〉牛可以是集合,數(shù)組然评,I/O channel折晦, 產(chǎn)生器generator 等。

聚合操作 類似SQL語句一樣的操作沾瓦, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同谦炒, Stream操作還有兩個(gè)基礎(chǔ)的特征:

Pipelining: 中間操作都會(huì)返回流對象本身贯莺。這樣多個(gè)操作可以串聯(lián)成一個(gè)管道, 如同流式風(fēng)格(fluent style)宁改。這樣做可以對操作進(jìn)行優(yōu)化缕探, 比如延遲執(zhí)行(laziness)和短路( short-circuiting)。

內(nèi)部迭代:以前對集合遍歷都是通過Iterator或者For-Each的方式, 顯式的在集合外部進(jìn)行迭代还蹲, 這叫做外部迭代爹耗。Stream提供了內(nèi)部迭代的方式, 通過訪問者模式(Visitor)實(shí)現(xiàn)谜喊。

在 Java 8 中, 集合接口有兩個(gè)方法來生成流:

stream() ? 為集合創(chuàng)建串行流潭兽。

parallelStream() ? 為集合創(chuàng)建并行流。

在這里插入圖片描述

API:

forEach() Stream 提供了新的方法 ‘forEach’ 來迭代流中的每個(gè)數(shù)據(jù),以下代碼片段使用 forEach 輸出了10個(gè)隨機(jī)數(shù):
在這里插入圖片描述
limit() 方法用于獲取指定數(shù)量的流,以下代碼片段使用 limit 方法打印出 10 條數(shù)據(jù):
在這里插入圖片描述
map() 方法用于映射每個(gè)元素到對應(yīng)的結(jié)果, 以下代碼片段使用 map 輸出了元素對應(yīng)的平方數(shù):
distinct() 去重 需要實(shí)現(xiàn)hascCode和equase方法
在這里插入圖片描述
filter() 方法用于通過設(shè)置的條件過濾出元素斗遏。以下代碼片段使用 filter 方法過濾出空字符串:
在這里插入圖片描述
sorted 方法用于對流進(jìn)行排序山卦。以下代碼片段使用 sorted 方法對輸出的 10 個(gè)隨機(jī)數(shù)進(jìn)行排序:
在這里插入圖片描述
并行(parallel)程序

parallelStream 是流并行處理程序的代替方法。以下實(shí)例我們使用 parallelStream 來輸出空字符串的數(shù)量:

在這里插入圖片描述

Collectors 結(jié)合 collect()方法后使用 Collectors.joining(String 分隔符) Collectors.toList()變?yōu)榧?br> Collectors 類實(shí)現(xiàn)了很多歸約操作诵次,例如將流轉(zhuǎn)換成集合和聚合元素账蓉。Collectors 可用于返回列表或字符串:

在這里插入圖片描述


五. 方法引用

方法引用通過方法的名字來指向一個(gè)方法。

方法引用可以使語言的構(gòu)造更緊湊簡潔逾一,減少冗余代碼铸本。

方法引用使用一對冒號(hào) :: 。

下面遵堵,我們在 Car 類中定義了 4 個(gè)方法作為例子來區(qū)分 Java 中 4 種不同方法的引用箱玷。

在這里插入圖片描述

構(gòu)造器引用:它的語法是Class::new,或者更一般的Class< T >::new實(shí)例如下:

      finalCarcar=Car.create(Car::new);

      finalList<Car>cars=Arrays.asList(car);

靜態(tài)方法引用:它的語法是Class::static_method鄙早,實(shí)例如下:

      cars.forEach(Car::collide);

特定類的任意對象的方法引用:它的語法是Class::method實(shí)例如下:

      cars.forEach(Car::repair);

特定對象的方法引用:它的語法是instance::method實(shí)例如下:

      finalCarpolice = Car.create(Car::new);

             cars.forEach(police::follow);

方法引用實(shí)例
在 Java8Tester.java 文件輸入以下代碼:


在這里插入圖片描述

實(shí)例中我們將 System.out::println 方法作為靜態(tài)方法來引用汪茧。

執(zhí)行以上腳本,輸出結(jié)果為:

在這里插入圖片描述

六. 日期時(shí)間 API

Java 8通過發(fā)布新的Date-Time API (JSR 310)來進(jìn)一步加強(qiáng)對日期與時(shí)間的處理限番。

因?yàn)镴ava的Date舱污,Calendar類型使用起來并不是很方便,而且Date類(據(jù)說)有著線程不安全等諸多弊端弥虐。同時(shí)若不進(jìn)行封裝扩灯,會(huì)在每次使用時(shí)特別麻煩媚赖。于是Java8推出了線程安全、簡易珠插、高可靠的時(shí)間包惧磺。并且數(shù)據(jù)庫中也支持LocalDateTime類型,在數(shù)據(jù)存儲(chǔ)時(shí)候使時(shí)間變得簡單捻撑。Java8這次新推出的包括三個(gè)相關(guān)的時(shí)間類型:LocalDateTime年月日十分秒磨隘;LocalDate日期;LocalTime時(shí)間顾患;三個(gè)包的方法都差不多番捂。

列出常用api,詳細(xì)的使用網(wǎng)上大片江解,大家自行查找:

//獲取當(dāng)前時(shí)間的LocalDateTime對象
//LocalDateTime.now();

//根據(jù)年月日構(gòu)建LocalDateTime
//LocalDateTime.of(); 

//比較日期先后
//LocalDateTime.now().isBefore(),
//LocalDateTime.now().isAfter(),


七. Optional 類

Optional不是對null關(guān)鍵字的一種替代设预,而是對于null判定提供了一種更加優(yōu)雅的實(shí)現(xiàn)。

NullPointException可以說是所有java程序員都遇到過的一個(gè)異常犁河,雖然java從設(shè)計(jì)之初就力圖讓程序員脫離指針的苦海鳖枕,但是指針確實(shí)是實(shí)際存在的,而java設(shè)計(jì)者也只能是讓指針在java語言中變得更加簡單桨螺、易用宾符,而不能完全的將其剔除,所以才有了我們?nèi)粘K姷降年P(guān)鍵字null彭谁。

空指針異常是一個(gè)運(yùn)行時(shí)異常吸奴,對于這一類異常,如果沒有明確的處理策略缠局,那么最佳實(shí)踐在于讓程序早點(diǎn)掛掉则奥,但是很多場景下,不是開發(fā)人員沒有具體的處理策略读处,而是根本沒有意識(shí)到空指針異常的存在。

<mark style="background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); box-sizing: border-box;">當(dāng)異常真的發(fā)生的時(shí)候唱矛,處理策略也很簡單罚舱,在存在異常的地方添加一個(gè)if語句判定即可</mark>,但是這樣的應(yīng)對策略會(huì)讓我們的程序出現(xiàn)越來越多的null判定,我們知道一個(gè)良好的程序設(shè)計(jì)绎谦,應(yīng)該讓代碼中盡量少出現(xiàn)null關(guān)鍵字管闷,而java8所提供的Optional類則在減少NullPointException的同時(shí),也提升了代碼的美觀度窃肠。但首先我們需要明確的是包个,它并 不是對null關(guān)鍵字的一種替代,而是對于null判定提供了一種更加優(yōu)雅的實(shí)現(xiàn)冤留,從而避免NullPointException碧囊。

1). 直觀感受

假設(shè)我們需要返回一個(gè)字符串的長度树灶,如果不借助第三方工具類,我們需要調(diào)用str.length()方法:

if(null == str) { // 空指針判定

return 0;

}

return str.length();

如果采用Optional類糯而,實(shí)現(xiàn)如下:

return Optional.ofNullable(str).map(String::length).orElse(0)

Optional的代碼相對更加簡潔天通,當(dāng)代碼量較大時(shí),我們很容易忘記進(jìn)行null判定熄驼,但是使用Optional類則會(huì)避免這類問題像寒。

2). 基本使用
1.對象創(chuàng)建
Optional<String> optStr = Optional.empty();

上面的示例代碼調(diào)用empty()方法創(chuàng)建了一個(gè)空的Optional對象型。

創(chuàng)建對象:不允許為空
Optional提供了方法of()用于創(chuàng)建非空對象瓜贾,該方法要求傳入的參數(shù)不能為空萝映,否則拋NullPointException,示例如下:

// 當(dāng)str為null的時(shí)候阐虚,將拋出NullPointException
Optional<String> optStr = Optional.of(str); 

2. 創(chuàng)建對象:允許為空

如果不能確定傳入的參數(shù)是否存在null值的可能性,則可以用Optional的ofNullable()方法創(chuàng)建對象蚌卤,如果入?yún)閚ull实束,則創(chuàng)建一個(gè)空對象。示例如下:

// 如果str是null逊彭,則創(chuàng)建一個(gè)空對象
Optional<String> optStr = Optional.ofNullable(str); 

3.流式處理

流式處理也是java8給我們帶來的一個(gè)重量級(jí)新特性咸灿,讓我們對集合的操作變得更加簡潔和高效。

這里Optional也提供了兩個(gè)基本的流失處理:映射和過濾侮叮。

為了演示避矢,我們設(shè)計(jì)了一個(gè)User類,如下:

public class User {

/** 用戶編號(hào) */

private long id;

private String name;

private int age;

private Optional<Long> phone;

private Optional<String> email;

public User(String name, int age) {

this.name = name;

this.age = age;

}

// 省略setter和getter

}

手機(jī)和郵箱不是一個(gè)人的必須有的囊榜,所以我們利用Optional定義审胸。

映射:map與flatMap

映射是將輸入轉(zhuǎn)換成另外一種形式的輸出的操作

比如前面例子中,我們輸入字符串卸勺,而輸出的是字符串的長度砂沛,這就是一種隱射,我們利用方法map()得以實(shí)現(xiàn)曙求。假設(shè)我們希望獲得一個(gè)人的姓名碍庵,那么我們可以如下實(shí)現(xiàn):

String name = Optional.ofNullable(user).map(User::getName).orElse("no name");

這樣當(dāng)入?yún)ser不為空的時(shí)候則返回其name,否則返回no name

如果我們希望通過上面方式得到phone或email悟狱,利用上面的方式則行不通了静浴,因?yàn)閙ap之后返回的是Optional,我們把這種稱為Optional嵌套挤渐,我們必須在map一次才能拿到我們想要的結(jié)果:

long phone = optUser.map(User::getPhone).map(Optional::get).orElse(-1L);

其實(shí)這個(gè)時(shí)候苹享,更好的方式是利用flatMap,一步拿到我們想要的結(jié)果:

long phone = optUser.flatMap(User::getPhone).orElse(-1L);

過濾:fliter

iliter挣菲,顧名思義是過濾的操作富稻,我們可以將過濾操作做為參數(shù)傳遞給該方法掷邦,從而實(shí)現(xiàn)過濾目的

假如我們希望篩選18周歲以上的成年人,則可以實(shí)現(xiàn)如下:

optUser.filter(u -> u.getAge() >= 18).ifPresent(u -> System.out.println("Adult:" + u));

4.默認(rèn)行為

默認(rèn)行為是當(dāng)Optional為不滿足條件時(shí)所執(zhí)行的操作椭赋,比如在上面的例子中我們使用的orElse()就是一個(gè)默認(rèn)操作抚岗,用于在Optional對象為空時(shí)執(zhí)行特定操作,當(dāng)然也有一些默認(rèn)操作是當(dāng)滿足條件的對象存在時(shí)執(zhí)行的操作哪怔。

get()

get用于獲取變量的值宣蔚,但是當(dāng)變量不存在時(shí)則會(huì)拋出NoSuchElementException,所以如果不確定變量是否存在认境,則不建議使用

orElse(Tother)

當(dāng)Optional的變量不滿足給定條件時(shí)胚委,則執(zhí)行orElse,比如前面當(dāng)str為null時(shí)叉信,返回0亩冬。

orElseGet(Supplier<? extends X> expectionSupplier)

如果條件不成立時(shí),需要執(zhí)行相對復(fù)雜的邏輯硼身,而不是簡單的返回操作硅急,則可以使用orElseGet實(shí)現(xiàn):

long phone = optUser.map(User::getPhone).map(Optional::get).orElseGet(() -> {

// do something here

return -1L;

});

orElseThrow(Supplier<? extends X> expectionSupplier)

與get()方法類似,都是在不滿足條件時(shí)返回異常佳遂,不過這里我們可以指定返回的異常類型营袜。

ifPresent(Consumer<? super T>)

當(dāng)滿足條件時(shí)執(zhí)行傳入的參數(shù)化操作。

3). 注意事項(xiàng)

Optional是一個(gè)final類丑罪,未實(shí)現(xiàn)任何接口荚板,所以當(dāng)我們在利用該類包裝定義類的屬性的時(shí)候,如果我們定義的類有序列化的需求吩屹,那么因?yàn)镺ptional沒有實(shí)現(xiàn)Serializable接口跪另,這個(gè)時(shí)候執(zhí)行序列化操作就會(huì)有問題:

public class User implements Serializable{

/** 用戶編號(hào) */

private long id;

private String name;

private int age;

 private Optional<Long> phone;  // 不能序列化

private Optional<String> email;  // 不能序列化

不過我們可以采用如下替換策略:

private long phone;

public Optional<Long> getPhone() {

return Optional.ofNullable(this.phone);

}



今天分享到此結(jié)束,通過本篇文章了解java8的新特性不僅強(qiáng)大而且感覺很多地方都能馬上使用起來煤搜,比如通過stream流處理集合數(shù)據(jù)結(jié)合lambda寫出高效罚斗、干凈、簡潔的代碼宅楞,通過Optional類優(yōu)雅的處理NPE针姿。rd們裝X的最高境界就是寫一手其他rd們看不懂又覺得很高大上的代碼了吧。哈哈哈厌衙。距淫。。本著學(xué)習(xí)的態(tài)度婶希,如果文章內(nèi)有出入地方請指出榕暇,看到留言后我會(huì)和大家討論學(xué)習(xí)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市彤枢,隨后出現(xiàn)的幾起案子狰晚,更是在濱河造成了極大的恐慌,老刑警劉巖缴啡,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件壁晒,死亡現(xiàn)場離奇詭異,居然都是意外死亡业栅,警方通過查閱死者的電腦和手機(jī)秒咐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碘裕,“玉大人携取,你說我怎么就攤上這事“锟祝” “怎么了雷滋?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長文兢。 經(jīng)常有香客問我惊豺,道長,這世上最難降的妖魔是什么禽作? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮揩页,結(jié)果婚禮上旷偿,老公的妹妹穿的比我還像新娘。我一直安慰自己爆侣,他們只是感情好萍程,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兔仰,像睡著了一般茫负。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乎赴,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天忍法,我揣著相機(jī)與錄音,去河邊找鬼榕吼。 笑死饿序,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的羹蚣。 我是一名探鬼主播原探,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咽弦?” 一聲冷哼從身側(cè)響起徒蟆,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎型型,沒想到半個(gè)月后段审,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡输莺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年戚哎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嫂用。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡型凳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘱函,到底是詐尸還是另有隱情甘畅,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布往弓,位于F島的核電站疏唾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏函似。R本人自食惡果不足惜槐脏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撇寞。 院中可真熱鬧顿天,春花似錦、人聲如沸蔑担。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啤握。三九已至鸟缕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間排抬,已是汗流浹背懂从。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹲蒲,地道東北人莫绣。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像悠鞍,于是被迫代替她去往敵國和親对室。 傳聞我的和親對象是個(gè)殘疾皇子模燥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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

  • Java 8自Java 5(發(fā)行于2004)以來最具革命性的版本。Java 8 為Java語言掩宜、編譯器蔫骂、類庫、開發(fā)...
    誰在烽煙彼岸閱讀 888評論 0 4
  • Java 8自Java 5(發(fā)行于2004)以來最具革命性的版本牺汤。Java 8 為Java語言辽旋、編譯器、類庫檐迟、開發(fā)...
    huoyl0410閱讀 627評論 1 2
  • 前言:Java 8 已經(jīng)發(fā)布很久了补胚,很多報(bào)道表明Java 8 是一次重大的版本升級(jí)。在Java Code Geek...
    糖寶_閱讀 1,322評論 1 1
  • 目錄結(jié)構(gòu) 介紹 Java語言的新特性2.1 Lambdas表達(dá)式與Functional接口2.2 接口的默認(rèn)與靜態(tài)...
    夜風(fēng)月圓閱讀 473評論 0 2
  • 5月11號(hào),他來北京敦间,13號(hào)他買錯(cuò)票瓶逃,買成520的票了,但是他還是決絕的坐飛機(jī)回去了廓块,16號(hào)他發(fā)來郵件說厢绝,我在你的...
    錯(cuò)落年間葉子閱讀 328評論 1 1