Lambda表达式和SteamAPI
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á)式更加簡(jiǎn)潔。
接著是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)勢(shì),使用 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)勢(shì),
?* 使用 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ù)列。簡(jiǎn)單說,對(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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无法查找网络工作组计算机,无法查看工作组
- 下一篇: 个人数据泄露问题的数据_非个人的个人数据