亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java8新特性lambda表達式有什么用(用法實例)

2019-11-26 15:29:25
字體:
來源:轉載
供稿:網友

我們期待了很久lambda為java帶來閉包的概念,但是如果我們不在集合中使用它的話,就損失了很大價值?,F有接口遷移成為lambda風格的問題已經通過default methods解決了,在這篇文章將深入解析Java集合里面的批量數據操作(bulk operation),解開lambda最強作用的神秘面紗。

1.關于JSR335

JSR是Java Specification Requests的縮寫,意思是Java 規范請求,Java 8 版本的主要改進是 Lambda 項目(JSR 335),其目的是使 Java 更易于為多核處理器編寫代碼。JSR 335=lambda表達式+接口改進(默認方法)+批量數據操作。加上前面兩篇,我們已是完整的學習了JSR335的相關內容了。

2.外部VS內部迭代

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

復制代碼 代碼如下:

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

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

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

復制代碼 代碼如下:
persons.forEach(p->p.setLastName("Doe"));

現在是由jdk 庫來控制循環了,我們不需要關心last name是怎么被設置到每一個person對象里面去的,庫可以根據運行環境來決定怎么做,并行,亂序或者懶加載方式。這就是內部迭代,客戶端將行為p.setLastName當做數據傳入api里面。

內部迭代其實和集合的批量操作并沒有密切的聯系,借助它我們感受到語法表達上的變化。真正有意思的和批量操作相關的是新的流(stream)API。新的java.util.stream包已經添加進JDK 8了。

3.Stream API

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

3.1中間與終點方法

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

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

3.1.1Filter

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

復制代碼 代碼如下:

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

3.1.2Map

假使我們現在過濾了一些數據,比如轉換對象的時候。Map操作允許我們執行一個Function的實現(Function<T,R>的泛型T,R分別表示執行輸入和執行結果),它接受入參并返回。首先,讓我們來看看怎樣以匿名內部類的方式來描述它:

復制代碼 代碼如下:

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

現在,把上述例子轉換成使用lambda表達式的寫法:

復制代碼 代碼如下:

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

3.1.3Count

count方法是一個流的終點方法,可使流的結果最終統計,返回int,比如我們計算一下滿足18歲的總人數:

復制代碼 代碼如下:

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

3.1.4Collect

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

復制代碼 代碼如下:

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

或者,如果我們想使用特定的實現類來收集結果:

復制代碼 代碼如下:

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

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

3.2順序流與并行流

每個Stream都有兩種模式:順序執行和并行執行。
順序流:

復制代碼 代碼如下:

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

并行流:
復制代碼 代碼如下:

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

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

3.2.1并行流原理:

復制代碼 代碼如下:

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

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

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

復制代碼 代碼如下:

long t0 = System.nanoTime();

//初始化一個范圍100萬整數流,求能被2整除的數字,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();

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

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

3.3關于Folk/Join框架

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

4.總結

如果沒有lambda,Stream用起來相當別扭,他會產生大量的匿名內部類,比如上面的3.1.2map例子,如果沒有default method,集合框架更改勢必會引起大量的改動,所以lambda+default method使得jdk庫更加強大,以及靈活,Stream以及集合框架的改進便是最好的證明。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费精品视频| 97视频网站入口| 伊人久久免费视频| 亚洲一区二区精品| 成人欧美一区二区三区在线湿哒哒| 一色桃子一区二区| 欧美国产日韩一区| 国产精品a久久久久久| 羞羞色国产精品| 久久99热精品这里久久精品| 欧美久久久精品| 国产亚洲免费的视频看| 国产精品亚洲第一区| 另类视频在线观看| 在线日韩精品视频| 国产精品久久精品| 美女视频久久黄| 久久久精品视频在线观看| 91网站在线看| 国产亚洲欧美另类中文| 91av视频在线播放| www.99久久热国产日韩欧美.com| 中国人与牲禽动交精品| 国产91精品久久久| 国产91色在线|免| 91免费版网站入口| 日韩精品在线第一页| 国产精品极品美女粉嫩高清在线| 亚洲a成v人在线观看| 欧美极品少妇xxxxⅹ裸体艺术| 欧美色欧美亚洲高清在线视频| 欧美成人四级hd版| 久久久国产成人精品| 欧美日在线观看| 亚洲在线观看视频网站| 久久精品成人动漫| 一本色道久久综合狠狠躁篇怎么玩| 国产日韩在线免费| 久久国产精品久久精品| 伦理中文字幕亚洲| 1769国产精品| 国产精品自产拍在线观看| 精品视频久久久久久| 亚洲一区二区精品| 亚洲欧洲国产精品| 国产成人精品一区二区在线| 欧美日韩一区二区三区| www.国产精品一二区| 欧美高清视频在线观看| 欧美一区二粉嫩精品国产一线天| 亚洲欧美日韩精品久久奇米色影视| 亚洲国产成人久久| 正在播放欧美一区| 91久久在线播放| 亚洲伊人久久大香线蕉av| 亚洲欧洲国产一区| 日韩欧美在线观看视频| 久久久免费精品视频| 久久精品视频播放| 国产精品h在线观看| 亚洲欧洲中文天堂| 欧美性色视频在线| 91精品国产91久久久久久久久| 国产精品久久久久久久7电影| 久久久999精品免费| 久久91亚洲人成电影网站| 欧美亚洲在线观看| 日韩av免费在线观看| 亚洲欧美成人一区二区在线电影| 久热精品在线视频| 欧美日韩国产999| 日韩国产精品一区| 丝袜美腿亚洲一区二区| 成人黄色免费在线观看| 国产91热爆ts人妖在线| 午夜精品www| 欧美激情精品久久久久久免费印度| 欧美精品情趣视频| 久久中文字幕在线视频| 精品国偷自产在线视频| 欧美日韩免费观看中文| 久久久精品久久久| 国产精品入口免费视| 成人国产在线视频| 久热精品视频在线观看| 国产精品6699| 欧美成在线视频| 国产欧美精品va在线观看| 久久中文久久字幕| 久久精品视频一| 午夜精品三级视频福利| 成人网在线视频| 97精品国产97久久久久久| 国产专区精品视频| 久久亚洲精品毛片| 91成人福利在线| 亚洲加勒比久久88色综合| 国内成人精品一区| 日韩精品在线免费观看视频| 国产精品十八以下禁看| 亚洲精品白浆高清久久久久久| 久久福利视频网| 精品国产乱码久久久久久天美| 青青久久av北条麻妃海外网| 久久精品国产91精品亚洲| 国产精品亚洲аv天堂网| 8x海外华人永久免费日韩内陆视频| 日韩va亚洲va欧洲va国产| 日韩在线视频线视频免费网站| 亚洲欧洲第一视频| 国产精品高潮粉嫩av| 91经典在线视频| 亚洲一区二区三| 久久久久久这里只有精品| 国产精品免费久久久久久| 国产精品免费视频xxxx| 136fldh精品导航福利| 国产ts一区二区| 亚洲一区二区国产| 午夜精品久久久久久久久久久久久| 国产精品女人网站| 色综合色综合久久综合频道88| 97国产精品久久| 日韩激情视频在线播放| 日韩欧美一区二区三区| 国产日韩中文字幕在线| 亚洲国产精品资源| 亚洲成人久久电影| 久久99国产综合精品女同| 精品亚洲一区二区| 日韩**中文字幕毛片| 亚洲欧美制服中文字幕| 美日韩精品视频免费看| 亚洲精品第一页| 亚洲专区在线视频| 欧美性少妇18aaaa视频| 久久躁狠狠躁夜夜爽| 中文字幕亚洲一区在线观看| 精品国产区一区二区三区在线观看| 97久久久免费福利网址| 亚洲专区国产精品| 欧洲精品毛片网站| 亚洲码在线观看| 激情成人中文字幕| 91天堂在线观看| 日韩欧美高清视频| 亚洲欧美日韩精品久久亚洲区| 精品视频久久久久久| 国内精品久久久久久久久| 久久精品视频99| 欧美日韩亚洲一区二区三区| 国产一区二区三区网站| 亚洲欧洲日韩国产| 成人深夜直播免费观看| 成人美女免费网站视频| 欧美激情手机在线视频| 国产91精品久久久久久久| 亚洲综合自拍一区| 成人福利网站在线观看| 91干在线观看| 欧美影院久久久| 国产一区二区精品丝袜| 57pao国产成人免费| 亚洲福利在线视频|