java8学习_java8学习
Java8 Lambda表達式和Stream學習
lambda表達式和Stream是Java8的新特性,這次分享一下我在學習lambda表達式和Stream的收獲。
這是這次測試用的Entity:
public classpeople {privateString name;privateString sex;privateInteger age;
}
這是測試實體類使用的數據:
ArrayList list = new ArrayList<>();for(int i = 0;i < 10 ;i++){
people people2= newpeople();
people2.setName("-----樓下小黑");
people2.setSex("男");
people2.setAge(30-i);
list.add(people2);
}
下面是簡單的使用lambda表達式對集合進行的一個簡單的排序。
p1和p2是對比的兩個people對象,使用對象的年齡字段來進行排序,正序排列,年齡最小的排在集合的第一位。
list.sort((p1,p2) -> p1.getAge().compareTo(p2.getAge()));
還可以和java8中的stream配合使用來對集合進行過濾操作,parallelStream也是流中的一個方法,并行流,將集合轉換成流之后,多線程來操作集合,代碼中還對集合進行了過濾,年齡大于25歲people對象,并通過foreach輸出,labdam表達式foreach結構跟普通的foreach循環結構類似,(parameters) -> expression 或者 (parameters) ->{ statements; }?,
操作時,他會自動判斷(parameters)的類型,然后在 -> 來對當前的people對象進行操作,如果集合對象數據量大的話,理論上可以提升效率,但是實際上如果數據量不大,還是循環迭代的效率更快,因為多線程的任務切換占用執行的大部分時間,代碼如下:
list.parallelStream().filter(people -> people.getAge()>25).forEach(people -> System.out.println(people));
這段代碼輸出的對象是年齡大于25歲的 而如果不使用lambda表達式和Stream,我們肯定直接想到的就是For循環來完成這個判斷,但是Foreach循環是循環每一個對象然后取年齡來進行判斷。而且For循環是封裝了迭代的語句塊,下面是使用iterator進行迭代的循環。
Iterator iterator =list.iterator();
while(iterator.hasNext()){
people p2 =iterator.next();
if(p2.getAge()>25){
System.out.println(p2);
}
}
整個迭代過程是調用iterator返回一個泛型為people的迭代對象,來控制整個循環的流程,使用hasNext和next來完成迭代;
而java8的Stream是則是通過Stream方法來創建一個Stream對象,然后之后所有的操作都是針對于這個Stream對象,Stream操作的是無序的對象,其中還有parallelStream并行流,可以多線程來操作集合對象在一些集合數據多的情況下來提升效率,而針對Stream的所有操作都是在操作Stream,只有foreach獲取結果時才能操作結果,所以這種迭代方式稱為內部迭代。
lambda表達和Stream搭配使用,在某些情況下,可以使代碼變得更效率,更簡潔。
Stream的學習
在前面的例子中,我們對通過Stream集合的操作可以分為三個步驟
獲得Stream對象,
Intermediate:通過一系列中間方法,對數據集進行過濾,檢索等操作.可能有多次Intermediate操作,
Terminal:最終步驟,完成對結果的操作,如上面例子中的foreach操作中的打印。
Intermediate:
concat:
可以將兩個Stream連接在一起,如果是兩個泛型不同的Stream也可以合并,但是會返回一個Object的Stream對象:
Stream.concat(Stream.of("1","2"), list.parallelStream()).forEach((obj) -> System.out.println(obj));
控制臺輸出的是people對象的toString()方法和1,2。
map:
遍歷Stream,相當于循環了,可以在遍歷每一個元素并且可以進行操作,下面是將每一個peopel對象的年齡乘以2,并輸出:
list.stream().map(people -> {people.setAge(people.getAge()*2);return people;}).forEach(people -> System.out.println(people));
distinct:
去掉重復的元素,注意,這里去掉重復不是對象,而是根據內存地址來判斷,如果你對象指向的棧或者堆中的地址是相同的,就會去掉重復的對象。
people people1 = new people("樓下小白", "女", 255);
list.add(people1);
list.add(people1);
list.stream().distinct().forEach(people-> System.out.println(people));
max:
可以找出Stream中某個可比值中最大的值。
Optional max = peopleStream.max((p1, p2) -> p1.getAge().compareTo(p2.getAge()));
min:則是將max換成min。
比較常用的就是這幾個方法了,其他還有一部分方法就不在這里一一寫出了。
還有的是,因為lambda表達式的方法語句看起來很簡單,所以變量名字如果可以盡寫的剪短一點,列入p1,p2這種,可以讓表達式變得更為簡潔。
Terminal:
結束操作,將經過中間操作的流結束,獲得經過中間操作的結果,最常見的是跟隨本次java8一起的更新在集合接口的內部迭代方法foreach方法。
總結
以上是生活随笔為你收集整理的java8学习_java8学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 打开jsp文件_jsp文件怎么
- 下一篇: 冒号运算 java_java 8 双冒号