jdk1.8新特性-java微博尚_第1頁
jdk1.8新特性-java微博尚_第2頁
jdk1.8新特性-java微博尚_第3頁
jdk1.8新特性-java微博尚_第4頁
jdk1.8新特性-java微博尚_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論