成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

lambda表達(dá)式在Java8中的作用有哪些

本篇文章給大家分享的是有關(guān)lambda表達(dá)式在Java8中的作用有哪些,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

為天心等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及天心網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、成都網(wǎng)站設(shè)計、天心網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

1.關(guān)于JSR335

JSR是Java Specification Requests的縮寫,意思是Java 規(guī)范請求,Java 8 版本的主要改進(jìn)是 Lambda 項目(JSR 335),其目的是使 Java 更易于為多核處理器編寫代碼。

2.外部VS內(nèi)部迭代

以前Java集合是不能夠表達(dá)內(nèi)部迭代的,而只提供了一種外部迭代的方式,也就是for或者while循環(huán)。

List persons = asList(new Person("Joe"), new Person("Jim"), new Person("John"));
for (Person p : persons) {
 p.setLastName("Doe");
}

上面的例子是我們以前的做法,也就是所謂的外部迭代,循環(huán)是固定的順序循環(huán)。在現(xiàn)在多核的時代,如果我們想并行循環(huán),不得不修改以上代碼。效率能有多大提升還說定,且會帶來一定的風(fēng)險(線程安全問題等等)。 

要描述內(nèi)部迭代,我們需要用到Lambda這樣的類庫,下面利用lambda和Collection.forEach重寫上面的循環(huán) 

persons.forEach(p->p.setLastName("Doe"));

現(xiàn)在是由jdk 庫來控制循環(huán)了,我們不需要關(guān)心last name是怎么被設(shè)置到每一個person對象里面去的,庫可以根據(jù)運行環(huán)境來決定怎么做,并行,亂序或者懶加載方式。這就是內(nèi)部迭代,客戶端將行為p.setLastName當(dāng)做數(shù)據(jù)傳入api里面。 內(nèi)部迭代其實和集合的批量操作并沒有密切的聯(lián)系,借助它我們感受到語法表達(dá)上的變化。真正有意思的和批量操作相關(guān)的是新的流(stream)API。新的java.util.stream包已經(jīng)添加進(jìn)JDK 8了。

3.Stream API

流(Stream)僅僅代表著數(shù)據(jù)流,并沒有數(shù)據(jù)結(jié)構(gòu),所以他遍歷完一次之后便再也無法遍歷(這點在編程時候需要注意,不像Collection,遍歷多少次里面都還有數(shù)據(jù)),它的來源可以是Collection、array、io等等。

3.1中間與終點方法

流作用是提供了一種操作大數(shù)據(jù)接口,讓數(shù)據(jù)操作更容易和更快。它具有過濾、映射以及減少遍歷數(shù)等方法,這些方法分兩種:中間方法和終端方法,“流”抽象天生就該是持續(xù)的,中間方法永遠(yuǎn)返回的是Stream,因此如果我們要獲取最終結(jié)果的話,必須使用終點操作才能收集流產(chǎn)生的最終結(jié)果。區(qū)分這兩個方法是看他的返回值,如果是Stream則是中間方法,否則是終點方法。

簡單介紹下幾個中間方法(filter、map)以及終點方法(collect、sum)

3.1.1Filter

在數(shù)據(jù)流中實現(xiàn)過濾功能是首先我們可以想到的最自然的操作了。Stream接口暴露了一個filter方法,它可以接受表示操作的Predicate實現(xiàn)來使用定義了過濾條件的lambda表達(dá)式。

List persons = …
Stream personsOver18 = persons.stream().filter(p -> p.getAge() > 18);//過濾18歲以上的人

3.1.2Map

假使我們現(xiàn)在過濾了一些數(shù)據(jù),比如轉(zhuǎn)換對象的時候。Map操作允許我們執(zhí)行一個Function的實現(xiàn)(Function<T,R>的泛型T,R分別表示執(zhí)行輸入和執(zhí)行結(jié)果),它接受入?yún)⒉⒎祷?。首先,讓我們來看看怎樣以匿名?nèi)部類的方式來描述它:

Stream adult= persons
    .stream()
    .filter(p -> p.getAge() > 18)
    .map(new Function() {
     @Override
     public Adult apply(Person person) {
      return new Adult(person);//將大于18歲的人轉(zhuǎn)為成年人
     }
    });

現(xiàn)在,把上述例子轉(zhuǎn)換成使用lambda表達(dá)式的寫法:

Stream map = persons.stream()
     .filter(p -> p.getAge() > 18)
     .map(person -> new Adult(person));

3.1.3Count

count方法是一個流的終點方法,可使流的結(jié)果最終統(tǒng)計,返回int,比如我們計算一下滿足18歲的總?cè)藬?shù)

int countOfAdult=persons.stream()
      .filter(p -> p.getAge() > 18)
      .map(person -> new Adult(person))
      .count();

3.1.4Collect

collect方法也是一個流的終點方法,可收集最終的結(jié)果

List adultList= persons.stream()
      .filter(p -> p.getAge() > 18)
      .map(person -> new Adult(person))
      .collect(Collectors.toList());

或者,如果我們想使用特定的實現(xiàn)類來收集結(jié)果:

List adultList = persons
     .stream()
     .filter(p -> p.getAge() > 18)
     .map(person -> new Adult(person))
     .collect(Collectors.toCollection(ArrayList::new));

篇幅有限,其他的中間方法和終點方法就不一一介紹了,看了上面幾個例子,大家明白這兩種方法的區(qū)別即可,后面可根據(jù)需求來決定使用。

3.2順序流與并行流

每個Stream都有兩種模式:順序執(zhí)行和并行執(zhí)行。

順序流:

List <Person> people = list.getStream.collect(Collectors.toList());

并行流:

List <Person> people = list.getStream.parallel().collect(Collectors.toList());

顧名思義,當(dāng)使用順序方式去遍歷時,每個item讀完后再讀下一個item。而使用并行去遍歷時,數(shù)組會被分成多個段,其中每一個都在不同的線程中處理,然后將結(jié)果一起輸出。

3.2.1并行流原理:

List originalList = someData;
split1 = originalList(0, mid);//將數(shù)據(jù)分小部分
split2 = originalList(mid,end);
new Runnable(split1.process());//小部分執(zhí)行操作
new Runnable(split2.process());
List revisedList = split1 + split2;//將結(jié)果合并

大家對hadoop有稍微了解就知道,里面的 MapReduce  本身就是用于并行處理大數(shù)據(jù)集的軟件框架,其 處理大數(shù)據(jù)的核心思想就是大而化小,分配到不同機(jī)器去運行map,最終通過reduce將所有機(jī)器的結(jié)果結(jié)合起來得到一個最終結(jié)果,與MapReduce不同,Stream則是利用多核技術(shù)可將大數(shù)據(jù)通過多核并行處理,而MapReduce則可以分布式的。

3.2.2順序與并行性能測試對比

如果是多核機(jī)器,理論上并行流則會比順序流快上一倍,下面是測試代碼

long t0 = System.nanoTime();

  //初始化一個范圍100萬整數(shù)流,求能被2整除的數(shù)字,toArray()是終點方法

  int a[]=IntStream.range(0, 1_000_000).filter(p -> p % 2==0).toArray();

  long t1 = System.nanoTime();

  //和上面功能一樣,這里是用并行流來計算

  int b[]=IntStream.range(0, 1_000_000).parallel().filter(p -> p % 2==0).toArray();

  long t2 = System.nanoTime();

  //我本機(jī)的結(jié)果是serial: 0.06s, parallel 0.02s,證明并行流確實比順序流快

  System.out.printf("serial: %.2fs, parallel %.2fs%n", (t1 - t0) * 1e-9, (t2 - t1) * 1e-9);

3.3關(guān)于Folk/Join框架

應(yīng)用硬件的并行性在java 7就有了,那就是 java.util.concurrent 包的新增功能之一是一個 fork-join 風(fēng)格的并行分解框架,同樣也很強(qiáng)大高效,有興趣的同學(xué)去研究,這里不詳談了,相比Stream.parallel()這種方式,我更傾向于后者。

以上就是lambda表達(dá)式在Java8中的作用有哪些,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文題目:lambda表達(dá)式在Java8中的作用有哪些
當(dāng)前URL:http://jinyejixie.com/article20/jjijco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、電子商務(wù)、App開發(fā)、網(wǎng)頁設(shè)計公司、虛擬主機(jī)、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
淄博市| 资源县| 乐安县| 陇川县| 娄烦县| 政和县| 晋中市| 保康县| 大洼县| 石阡县| 屏南县| 遂溪县| 金塔县| 和林格尔县| 澎湖县| 洪洞县| 胶州市| 高州市| 胶州市| 邹平县| 贞丰县| 浦县| 利辛县| 田林县| 旬邑县| 西昌市| 昭通市| 海阳市| 洮南市| 澎湖县| 紫金县| 准格尔旗| 天祝| 沂水县| 新民市| 孝昌县| 页游| 霍山县| 祁东县| 和硕县| 山阴县|