日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lambda表达式和SteamAPI

發(fā)布時(shí)間:2023/12/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lambda表达式和SteamAPI 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Lambda表達(dá)式和SteamAPI是JDK8的新特性,所有在實(shí)驗(yàn)下面代碼時(shí)候,請(qǐng)升級(jí)JDK到8版本,否則會(huì)編譯 報(bào)錯(cuò)。

首先看Lambda表達(dá)式,同正則表達(dá)式類似,Lambda表達(dá)式不能在JAVA代碼中直接使用,先得做一下封裝。


import java.util.ArrayList;

public class LabExamp {
?? ?/**
?? ? *? Lambda表達(dá)式(λ表達(dá)式)可見有三部分組成:參數(shù)列表,箭頭(->),以及一個(gè)表達(dá)式或語句塊。
?? ? * @param args
?? ? */
?? ?public static void main(String[] args) {
?? ??? ?// TODO Auto-generated method stub
?? ??? ?//Runnable r1=(x,y)->{return x+y;};
?? ??? ?ArrayList<Student> list=new ArrayList<Student>();
?? ??? ?Student std1=new Student();
?? ??? ?std1.setId(1);
?? ??? ?std1.setName("小王");
?? ??? ?list.add(std1);
?? ??? ?Student std2=new Student();
?? ??? ?std2.setId(2);
?? ??? ?std2.setName("小張");
?? ??? ?list.add(std2);
?? ??? ?
?? ?//?? ?list.forEach(o -> {System.out.println(o);});
?? ?//?? ?list.forEach(o -> ((Student) o).getName()); //如果省略ArrayList的類型聲明,則必須這么寫強(qiáng)制轉(zhuǎn)型
?? ??? ?list.forEach(stu -> {System.out.println( stu.getName());});
?? ??? ?
?? ??? ?
?? ??? ?for(Student o: list) { // 外部迭代
?? ??? ???????? System.out.println(o.getName());
?? ??? ?}
?? ??? ?
?? ??? ?
?? ?}
?? ?
}

---------------------------------------------------------------------------


public class Student {
?? ?private? Integer id;
??? private? String name;
?? ?public Integer getId() {
?? ??? ?return id;
?? ?}
?? ?public void setId(Integer id) {
?? ??? ?this.id = id;
?? ?}
?? ?public String getName() {
?? ??? ?return name;
?? ?}
?? ?public void setName(String name) {
?? ??? ?this.name = name;
?? ?}
}


上面例子中可以看出,Lambda表達(dá)式跟for循環(huán)的代碼效果是一樣的,但是用Lambda表達(dá)式更加簡潔。



接著是SteamAPI,

Java 8 中的 Stream 是對(duì)集合(Collection)對(duì)象功能的增強(qiáng),它專注于對(duì)集合對(duì)象進(jìn)行各種非常便利、高效的聚合操作(aggregate operation),或者大批量數(shù)據(jù)操作 (bulk data operation)。Stream API 借助于同樣新出現(xiàn)的 Lambda 表達(dá)式,極大的提高編程效率和程序可讀性。同時(shí)它提供串行和并行兩種模式進(jìn)行匯聚操作,并發(fā)模式能夠充分利用多核處理器的優(yōu)勢,使用 fork/join 并行方式來拆分任務(wù)和加速處理過程。


import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class SteamExamp {
/*
?*
?* Stream API 借助于同樣新出現(xiàn)的 Lambda 表達(dá)式,極大的提高編程效率和程序可讀性。
?* 同時(shí)它提供串行和并行兩種模式進(jìn)行匯聚操作,并發(fā)模式能夠充分利用多核處理器的優(yōu)勢,
?* 使用 fork/join 并行方式來拆分任務(wù)和加速處理過程。通常編寫并行代碼很難而且容易出錯(cuò),
?* 但使用 Stream API 無需編寫一行多線程的代碼,就可以很方便地寫出高性能的并發(fā)程序。
?*/
?? ?public static void main(String[] args) {
?? ??? ?ArrayList<Student> list=new ArrayList<Student>();
?? ??? ?Student std1=new Student();
?? ??? ?std1.setId(1);
?? ??? ?std1.setName("小王");
?? ??? ?list.add(std1);
?? ??? ?Student std2=new Student();
?? ??? ?std2.setId(2);
?? ??? ?std2.setName("小張");
?? ??? ?list.add(std2);
?? ??? ?Student std6=new Student();
?? ??? ?std6.setId(6);
?? ??? ?std6.setName("小劉");
?? ??? ?list.add(std6);?? ?
?? ??? ?Student std3=new Student();
?? ??? ?std3.setId(3);
?? ??? ?std3.setName("小李子");
?? ??? ?list.add(std3);?? ?

//?? ??? ?ArrayList<Student> transactionsIds = list.parallelStream().
//?? ??? ??? ??? ? filter(t -> t.getType() == Transaction.GROCERY).
//?? ??? ??? ??? ? sorted(comparing(Transaction::getValue).reversed()).
//?? ??? ??? ??? ? map(Transaction::getId).
//?? ??? ??? ??? ? collect(toList());
?? ??? ?ArrayList<Integer> transactionsIds = (ArrayList<Integer>) list.parallelStream().
?? ??? ??? ??? ? sorted((p1, p2) ->? p1.getId().compareTo(p2.getId())).
?? ??? ??? ??? ? map(Student::getId).
?? ??? ??? ??? ? collect(Collectors.toList());?? ?
?? ??? ?ArrayList<Integer> transactionsIds2 = (ArrayList<Integer>) list.parallelStream().
?? ??? ??? ??? ? sorted((p1, p2) ->? p2.getId().compareTo(p1.getId())).
?? ??? ??? ??? ? map(Student::getId).
?? ??? ??? ??? ? collect(Collectors.toList());
?? ??? ?System.out.println(transactionsIds);
?? ??? ?System.out.println(transactionsIds2);
?? ??? ?
?? ??? ?//流的數(shù)據(jù)源不一定是一個(gè)已存在的集合對(duì)象,也可能是個(gè)“生成器函數(shù)”。一個(gè)生成器函數(shù)會(huì)產(chǎn)生一系列元素,供給一個(gè)流。
?? ??? ?//Stream.generate(Supplier<T> s)就是一個(gè)生成器函數(shù)。其中參數(shù)Supplier是一個(gè)函數(shù)接口,里面有唯一的抽象方法 <T> get()。
?? ??? ?Stream.generate(Math::random).limit(5).forEach(System.out::println);
?? ?}



}

----------------------------------------------------

上例輸出結(jié)果可能是:

[1, 2, 3, 6]
[6, 3, 2, 1]
0.10556146349285433
0.08263394346689457
0.13330880751987728
0.05459269439895098
0.055821882208000884


=======================================================

上面程序的例子就是使用了SteamAPI實(shí)現(xiàn)了ArrayList正序和逆序的排列。最后一段是如何產(chǎn)生應(yīng)該5個(gè)元素的隨機(jī)數(shù)列。簡單說,對(duì) Stream 的使用就是實(shí)現(xiàn)一個(gè) filter-map-reduce 過程,產(chǎn)生一個(gè)最終結(jié)果,或者導(dǎo)致一個(gè)副作用(side effect)。Java8引入Steam概念的目標(biāo)是配合“集合類批處理操作”的內(nèi)部迭代和并行處理。



總結(jié)

以上是生活随笔為你收集整理的Lambda表达式和SteamAPI的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。