版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
Java8新特性講師::Demonxx_:尚硅谷-主要內(nèi)容Lambda
表達式函數(shù)式接口方法
與構(gòu)造器Stream
API接口中的默認(rèn)方法與靜態(tài)方法Java
8新特性簡介速度更快ambda
表達式)代碼更少(增加了新的語強大的Stream
API便于并行最大化減少空指針異常Optional其中最為的為Lambda
表達式與Stream
API1-Lambda表達式為什么使用Lambda
表達式Lambda是一個函數(shù),我們可以把Lambda表達式理解為是一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進行傳遞)??梢詫懗龈啙?、更靈活的代碼。作為一種更緊湊的代碼風(fēng)格,使
Java的語言表達能力得到了提升。Lambda
表達式從類到Lambda的轉(zhuǎn)換Lambda
表達式Lambda
表達式語法Lambda表達式在Java語言中引入了一個新的語法元素和操作符。這個操作符為“->”,該操作符被稱為Lambda操作符或剪頭操作符。它將Lambda分為兩個部分:左側(cè):指定了Lambda表達式需要的所有參數(shù)右側(cè):指定了的功能。Lambda體,即Lambda表達式要執(zhí)行Lambda
表達式語法第一種語法:無參,無返回值,Lambda
體只需一條語句第二種語ambda
需要一個參數(shù)第三種語ambda
只需要一個參數(shù)時,參數(shù)的小括號可以省略Lambda
表達式語法第四種語ambda
需要兩個參數(shù),并且有返回值第五種語法:當(dāng)Lambda
體只有一條語句時,return
與大括號可以省略第六種語法:數(shù)據(jù)類型可以省略,因為可由編譯器推斷得出,稱為“類型推斷”類型推斷上述Lambda表達式中的參數(shù)類型都是由編譯器推斷得出的。Lambda表達式中無需指定類型,程序依然可以編譯,這是因為javac根據(jù)程序的上下文,在推斷出了參數(shù)的類型。Lambda表達式的類型依賴于上下文環(huán)境,是由編譯器推斷出來的。這就是所謂的
“類型推斷”2-函數(shù)式接口函數(shù)式接口只包含一個抽象方法的接口,稱為函數(shù)式接口。你可以通過
Lambda
表達式來創(chuàng)建該接口的對象。(若
Lambda表達式拋出一個受檢異常,那么該異常需要在目標(biāo)接口的抽象方法上進行 )。我們可以在任意函數(shù)式接口上使用
@FunctionalInterface注解,這樣做可以檢查它是否是一個函數(shù)式接口,同時
javadoc
也會包含一條 ,說明這個接口是一個函數(shù)式接口。自定義函數(shù)式接口函數(shù)式接口中使用泛型:作為參數(shù)傳遞Lambda
表達式作為參數(shù)傳遞Lambda表達式:為了將Lambda表達式作為參數(shù)傳遞,接收Lambda表達式的參數(shù)類型必須是與該Lambda表達式兼容的函數(shù)式接口的類型。作為參數(shù)傳遞Lambda
表達式:Java
內(nèi)置四大函數(shù)式接口函數(shù)式接口參數(shù)類型返回類型用途Consumer<T>消費型接口Tvoid對類型為T的對象應(yīng)用操作,包含方法:
void
accept(T
t)r<T>供給型接口無T返回類型為T的對象,包含方法:T
get();Function<T,
R>函數(shù)型接口TR對類型為T的對象應(yīng)用操作,并返回結(jié)果。結(jié)果是R類型的對象。包含方法:R
apply(T
t);Predicate<T>斷定型接口Tboolean確定類型為T的對象是否滿足某約束,并返回
boolean值。包含方法
boolean
test(T
t);其他接口函數(shù)式接口參數(shù)類型返回類型用途BiFuncation<T,
U,
R>T,
UR對類型為T,
U參數(shù)應(yīng)用操作,返回R類型的結(jié)果。包含方法為R
apply(T
t,
Uu);UnaryOperator<T>(Function子接口)TT對類型為T的對象進行一元運算,并返回T類型的結(jié)果。包含方法為T
apply(T
t);BinaryOperator<T>(BiFunction子接口)T,
TT對類型為T的對象進行二元運算,并返回T類型的結(jié)果。包含方法為T
apply(T
t1,
Tt2);Consumer<T,
U>T,
Uvoid對類型為T,
U參數(shù)應(yīng)用操作。包含方法為void
accept(T
t,
U
u)ToIntFunction<T>ToLongFunction<T>ToDoubleFunction<T>Tintlongdouble分別計算int、long、double、值的函數(shù)IntFunction<R>LongFunction<R>DoubleFunction<R>intlongdoubleR參數(shù)分別為int、long、double類型的函數(shù)3-方法與構(gòu)造器方法需要使用操作符“::”將方法名和對象或類的名字分隔開來。如下三種主要使用情況:對象::實例方法類::靜態(tài)方法類::實例方法方法需要使用操作符“::”將方法名和對象或類的名字分隔開來。如下三種主要使用情況:對象::實例方法類::靜態(tài)方法類::實例方法方法例如:等同于:例如:等同于:方法例如:等同于:注意:當(dāng)需要 方法的第一個參數(shù)是調(diào)用對象,并且第二個參數(shù)是需要引用方法的第二個參數(shù)時:ClassName::methodName構(gòu)造器格式:
ClassName::new與函數(shù)式接口相結(jié)合,自動與函數(shù)式接口中方法兼容??梢园褬?gòu)造器 賦值給定義的方法,與構(gòu)造器參數(shù)列表要與接口中抽象方法的參數(shù)列表一致!例如:等同于:數(shù)組格式:type[]::new例如:等同于:4-強大的Stream
API了解StreamJava8中有兩大最為重要的改變。第一個是Lambda表達式;另外一個則是Stream
API(java.util.stream.*)。Stream是Java8中處理集合的關(guān)鍵抽象概念,它可以指定你希望對集合進行的操作,可以執(zhí)行非常復(fù)雜的查找、過濾和
數(shù)據(jù)等操作。使用Stream
API
對集合數(shù)據(jù)進行操作,就類似于使用
SQL
執(zhí)行的數(shù)據(jù)庫查詢。也可以使用
Stream
API
來并行執(zhí)行操作。簡而言之,Stream
API
提供了一種高效且易于使用的處理數(shù)據(jù)的方式。Stream流(Stream)到底是什么呢?是數(shù)據(jù) ,用于操作數(shù)據(jù)源(集合、數(shù)組等)所生成的元素序列。“集合講的是數(shù)據(jù),流講的是計算!”注意:①Stream
自己不會
元素。②Stream不會改變源對象。相反,他們會返回一個持有結(jié)果的新Stream。③Stream操作是延遲執(zhí)行的。這意味著他們會等到需要結(jié)果的時候才執(zhí)行。Stream的操作三個步驟創(chuàng)建Stream一個數(shù)據(jù)源(如:集合、數(shù)組),獲取一個流中間操作一個中間操作鏈,對數(shù)據(jù)源的數(shù)據(jù)進行處理終止操作(終端操作)一個終止操作,執(zhí)行中間操作鏈,并產(chǎn)生結(jié)果創(chuàng)建StreamJava8中的
Collection接口被擴展,提供了兩個獲取流的方法:default
Stream<E>stream():返回一個順序流default
Stream<E>
parallelStream():返回一個并行流由數(shù)組創(chuàng)建流Java8中的
Arrays的靜態(tài)方法stream()可以獲取數(shù)組流:static
<T>
Stream<T>
stream(T[]
array):返回一個流重載形式,能夠處理對應(yīng)基本類型的數(shù)組:publicstaticIntStream
stream(int[]
array)publicstaticLongStream
stream(long[]
array)publicstaticDoubleStream
stream(double[]
array)由值創(chuàng)建流可以使用靜態(tài)方法Stream.of(),通過顯示值創(chuàng)建一個流。它可以接收任意數(shù)量的參數(shù)。public
static<T>
Stream<T>
of(T...values):返回一個流由函數(shù)創(chuàng)建流:創(chuàng)建無限流可以使用靜態(tài)方法Stream.iterate()和Stream.generate(),創(chuàng)建無限流。迭代public
static<T>Stream<T>iterate(final
Tseed,
finalUnaryOperator<T>f)生成public
static<T>Stream<T>generate( r<T>
s)
:Stream
的中間操作多個中間操作可以連接起來形成一個流水線,除非流水線上觸發(fā)終止操作,否則中間操作不會執(zhí)行任何的處理!而在終止操作時 全部處理,稱為“惰性求值”。篩選與切片方
法描
述filter(Predicate
p)接收
Lambda,從流中排除某些元素。distinct()篩選,通過流所生成元素的hashCode()和equals()去除重復(fù)元素limit(long
maxSize)截斷流,使其元素不超過給定數(shù)量。skip(long
n)跳過元素,返回一個扔掉了前n個元素的流。若流中元素不足n個,則返回一個空流。與
limit(n)互補Stream
的中間操作方
法描
述map(Function
f)接收一個函數(shù)作為參數(shù),該函數(shù)會被應(yīng)用到每個元素上,并將其 成一個新的元素。mapToDouble(ToDoubleFunction
f)接收一個函數(shù)作為參數(shù),該函數(shù)會被應(yīng)用到每個元素上,產(chǎn)生一個新的DoubleStream。mapToInt(ToIntFunction
f)接收一個函數(shù)作為參數(shù),該函數(shù)會被應(yīng)用到每個元素上,產(chǎn)生一個新的InputStream。mapToLong(ToLongFunction
f)接收一個函數(shù)作為參數(shù),該函數(shù)會被應(yīng)用到每個元素上,產(chǎn)生一個新的LongStream。flatMap(Function
f)接收一個函數(shù)作為參數(shù),將流中的每個值都換成另一個流,然后把所有流連接成一個流Stream
的中間操作排序方
法描
述sorted()產(chǎn)生一個新流,其中按自然順序排序sorted(Comparator
comp)產(chǎn)生一個新流,其中按比較器順序排序Stream
的終止操作終端操作會從流的流水線生成結(jié)果。其結(jié)果可以是任何不是流的值,例如:List、Integer,甚至是void。查找與匹配方
法描
述allMatch(Predicate
p)檢查是否匹配所有元素anyMatch(Predicate
p)檢查是否至少匹配一個元素noneMatch(Predicate
p)檢查是否沒有匹配所有元素find
()返回第一個元素findAny()返回當(dāng)前流中的任意元素Stream
的終止操作方
法描
述count()返回流中元素總數(shù)max(Comparator
c)返回流中最大值min(Comparator
c)返回流中最小值forEach(Consumer
c)迭代(使用Collection接口需要用戶去做迭代,稱為外部迭代。相反,Stream
API使用迭代——它幫你把迭代做了)reduce(T
iden,
BinaryOperator
b)可以將流中元素反復(fù)結(jié)合起來,得到一個值。返回Treduce(BinaryOperator
b)可以將流中元素反復(fù)結(jié)合起來,得到一個值。返回Optional<T>歸約備注:map
和reduce
的連接通常稱為map-reduce模式,因來進行網(wǎng)絡(luò)搜索而出名。用它Stream
的終止操作收集方
法描
述collect(Collector
c)將流轉(zhuǎn)換為其他形式。接收一個Collector接口的實現(xiàn),用于給Stream中元素做匯總的方法Collector接口中方法的實現(xiàn)決定了如何對流執(zhí)行收集操作(如收集到
List、Set、Map)。但是
Collectors實用類提供了很多靜態(tài)方法,可以方便地創(chuàng)建常見收集器實例,具體方法與實例如下表:方法返回類型作用toListList<T>把流中元素收集到ListList<Dish>
dishes
=
.stream().collect(Collectors.toList());toSetSet<T>把流中元素收集到SetSet<Dish>
dishes
=
.stream().collect(Collectors.toSet());toCollectionCollection<T>把流中元素收集到創(chuàng)建的集合Collection<Dish>dishes3=
.stream().collect(Collectors.toCollection(ArrayList::new));countingLong計算流中元素的個數(shù)long
count
=
.stream().collect(Collectors.counting());summingIntInteger對流中元素的整數(shù)屬性求和inttotal=
.stream().collect(Collectors.summingInt(Dish::getCalories));averagingIntDouble計算流中元素Integer屬性的平均值doubleavg=
.stream().collect(Collectors.averagingInt(Dish::getCalories));summarizingIntIntSummaryStatistics收集流中Integer屬性的統(tǒng)計值。如:平均值IntSummaryStatisticsiss=
.stream().collect(Collectors.summarizingInt(Dish::getCalories));joiningString連接流中每個字符串Stringstr=
.stream().map(Dish::getName).collect(Collectors.joining());maxByOptional<T>根據(jù)比較器選擇最大值Optional<Dish>max=
.stream().collect(Collectors.maxBy(comparingInt(Dish::getCalories)));minByOptional<T>根據(jù)比較器選擇最小值Optional<Dish>
min
=
.stream().collect(Collectors.minBy(comparingInt(Dish::getCalories)));reducing歸約產(chǎn)生的類型從一個作為累加器的初始值開始,利用BinaryOperator與流中元素逐個結(jié)合,從而歸約成單個值inttotalCal=
.stream().collect(Collectors.reducing(0,
Dish::getCalories,
Integer::sum));collectingAndThen轉(zhuǎn)換函數(shù)返回的類型另一個收集器,對其結(jié)果轉(zhuǎn)換函數(shù)inthow=.stream().collect(Collectors.collectingAndThen(Collectors.toList(),
List::size));grou
ByMap<K,
List<T>>根據(jù)某屬性值對流分組,屬性為K,結(jié)果為VMap<Dish.Type,
List<Dish>>
map=
.stream().collect(Collectors.grou
By(Dish::getType));partitioningByMap<Boolean,
List<T>>根據(jù)true或false進行分區(qū)Map<Boolean,List<Dish>>vd=
.stream().collect(Collectors.partitioningBy(Dish::isVegetarian));并行流與順序流并行流就是把一個內(nèi)容分成多個數(shù)據(jù)塊,并用不同的線程分別處理每個數(shù)據(jù)塊的流。Java8中將并行進行了優(yōu)化,我們可以很容易的對數(shù)據(jù)進行并行操作。Stream
API
可以
性地通過
parallel()
與sequential()
在并行流與順序流之間進行切換。Fork/Join框架:就是在必要的情況下,將一個大任務(wù),進行拆分(fork)成若干個小任務(wù)(拆到不可再拆時),再將一個個的小任務(wù)運算的結(jié)果進行join匯總.了解Fork/Join框架任務(wù)遞歸分配成若干小任務(wù)并行求值forkforkforkforkjoinjoinjoin合并部分結(jié)果Fork/Join框架與傳統(tǒng)線程池的區(qū)別采用“工作竊取”模式(work-stealing):當(dāng)執(zhí)行新的任務(wù)時它可以將其拆分分成更小的任務(wù)執(zhí)行,并將小任務(wù)加到線程隊列中,然后再從一個隨機線程的隊列中偷一個并把它放在自己的隊列中。相對于一般的線程池實現(xiàn),fork/join
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 文化誤讀的教育策略研究-洞察分析
- 用戶體驗與心理機制-洞察分析
- 營養(yǎng)素攝入與疾病預(yù)防-洞察分析
- 物聯(lián)網(wǎng)安全標(biāo)準(zhǔn)制定與推廣-洞察分析
- 2024年株洲三三一醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 養(yǎng)老機構(gòu)資產(chǎn)管理合同
- 2024年曲陽縣中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2024年05月天津興業(yè)銀行天津分行招考筆試歷年參考題庫附帶答案詳解
- 《語文植物的睡眠》課件
- 2024年景寧縣人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 新業(yè)娛樂安全評價報告
- 醫(yī)保工作自查表
- 調(diào)休單、加班申請單
- 小學(xué)-英語-湘少版-01-Unit1-What-does-she-look-like課件
- 單證管理崗工作總結(jié)與計劃
- 規(guī)劃設(shè)計收費標(biāo)準(zhǔn)
- 安全安全隱患整改通知單及回復(fù)
- 國有檢驗檢測機構(gòu)員工激勵模式探索
- 采購部年終總結(jié)計劃PPT模板
- CDI-EM60系列變頻調(diào)速器使用說明書
- 【匯總】高二政治選擇性必修三(統(tǒng)編版) 重點知識點匯總
評論
0/150
提交評論