Java8中的一些概念和新特性
說到Java8都會說到函數(shù)式編程或者都說提到lamdba表達(dá)式,先具體講個個概念解釋一遍
函數(shù)式編程
什么是函數(shù)式編程,
為什么要使用函數(shù)編程說到函數(shù)式編程一般都會提出上面兩個疑問
什么是函數(shù)式編程厦凤,過去我們的編程習(xí)慣,稱為指令式編程李茫,命令式編程规辱,或是聲明式編程, 這種編程的風(fēng)格非常適合經(jīng)典的面向?qū)ο缶幊蹋?strong>專注于如何實(shí)現(xiàn)疚沐,如下面代碼暂氯,從列表中找到最昂貴的事務(wù)
if (mostExpensive==null){
throw new IllegalAccessException("Empty list of transactions");
}
for (Transaction t:transactions.subList(1,transactions.size())){
if (t.getValue()>mostExpensive.getValue()){
mostExpensive=t;
}
}```
而函數(shù)式編程的特點(diǎn)在于 更加關(guān)注要做什么,最終實(shí)現(xiàn)的細(xì)節(jié) 留給函數(shù)庫亮蛔,這種思想稱之為內(nèi)部迭代痴施,它的特點(diǎn)在于讓人讀起來像是問題的陳述
``` Optional<Transaction> mostExpensive = transactions.stream().max(Comparator.comparing(Transaction::getValue));```
函數(shù)式編程的定義是什么:**簡單的說是一種使用函數(shù)來進(jìn)行編程的方式**,復(fù)雜的定義:**是將代碼傳遞給方法(同時也能夠返回代碼并將其包含在數(shù)據(jù)結(jié)構(gòu)中)究流,還能讓我們能夠使用一整套新技巧辣吃,稱為函數(shù)式編程**
為什么要使用函數(shù)式編程 他的好處是什么
-------------------
1. 代碼量少很多
2. 易于閱讀
3. 無副作用:副作用指的是:函數(shù)在調(diào):用過程中,除了給出了返回值外芬探,還修改了函數(shù)外部的狀態(tài)神得,函數(shù)的副用作應(yīng)該被盡量避免,這種函數(shù)調(diào)用的副作用偷仿,在函數(shù)式編程里哩簿,需要進(jìn)行有效的限制。
4. 尾遞歸優(yōu)化:過去遞歸的最大問題在于它總是使用椩途玻空間节榜,現(xiàn)在我們不需要再不同的棧幀上保持每次遞歸計(jì)算的中間數(shù)值,編譯器能夠自行決定服用某一個棧幀進(jìn)行計(jì)算别智。
5. 易于并行宗苍,內(nèi)部的迭代讓我們可以并行處理一個流,而無需再代碼中顯示使用和協(xié)調(diào)不同的線程薄榛。
6. 避免了空指針讳窟,通過optional 來取代null 的時候發(fā)生的情況。
同時java8提供了新的特性和API供我們使用
1. 對于過去Date和Calendar來處理時間非常非常的不便蛇数,在1.8中引入了LocalDate和LocalTime instant Duration等來方便解決時間日期等問題
2. 提供行為的多繼承
```public interface Sized{
int size();
default boolean isEmpty(){
return size()==0;
}}
如果這個接口有多個實(shí)現(xiàn)類 突然接口多一個方法 實(shí)現(xiàn)類要必須實(shí)現(xiàn)這個方法 會非常不便挪钓,通過defalut 讓改進(jìn)API對象有多實(shí)現(xiàn) 所有就相應(yīng)的出現(xiàn)了多繼承行為的情況```
Java8的名詞
==
1. 行為參數(shù)化:面向接口編程的概念相同(個人理解),將相同的行為耳舅,提取出來稱為一個接口碌上。 2. 函數(shù)式接口:只定義一個抽象方法的接口稱為函數(shù)式接口如
` @FunctionalInterfacepublic interface Runnable { public abstract void run();}FunctionalInterface 這個注解是來讓編譯器檢查當(dāng)前是否是一個函數(shù)式接口`
函數(shù)描述符:函數(shù)式接口的抽象方法的基本簽名基本上就是lambda表達(dá)式的簽名倚评。我們將這種抽象方法稱為函數(shù)描述符如`(Apple,Apple)->int ` 代表兩個Apple作為參數(shù)傳遞進(jìn)來返回一個int的函數(shù)
3. 流:定義:從支持?jǐn)?shù)據(jù)處理操作的源生成的元素序列 3. 元素序列:集合和流類似馏予,可以訪問特定元素類型的一組值天梧。但是集合是數(shù)據(jù)結(jié)構(gòu),主要的目的是一特定的時間/空間復(fù)雜度存儲和訪問元素霞丧。但是流的目的在于計(jì)算呢岗。
4. 源:流會使用一個提供數(shù)據(jù)的源,
5. 數(shù)據(jù)處理操作蛹尝,常見操作如filter后豫,map reduce find match sort等
6. 流水線:很多 流操作本身會返回一個流,多個操作就可以連接起來
7. 內(nèi)部迭代突那, 和顯示的迭代不同挫酿,流的迭代是在背后進(jìn)行的。
3. 收集器:也可以理解為終端操作愕难,它接受參數(shù)是流中的元素累計(jì)到匯總結(jié)果的各種方式早龟。
**在Android Studio 使用lamdba**
```在最外層的 build.gradle dependencies
{
classpath 'me.tatarka:gradle-retrolambda:3.2.5'
}
在需要的modelu中build.gradle 添加 apply plugin: 'me.tatarka.retrolambda'
在Android 的標(biāo)簽下 加入compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
就可以在Android Studio 中使用lamdba了