Java8之Stream流代替For迴圈操作
Stream流代替For迴圈進行輸出可以使程式碼更簡潔。
需求:根據姓名獲取員工資訊
1.建立實體類:Emp
public class Emp { private String id; private String name; public Emp(String id,String name) { this.id=id; this.name=name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Emp資訊: [id=" + id + ",name=" + name + "]"; }
2.測試類:
(1.) 原始For寫法:
List<Emp> emps = new ArrayList<>(); emps.add(new Emp("00101","張三")); emps.add(new Emp("00102","張四")); emps.add(new Emp("00103","張五")); emps.add(new Emp("00104","張六")); emps.add(new Emp("00105","張七")); for (Emp emp : emps) { if (emp.getName().equals("張三")) { System.out.println(emp); return; } }
(2.) Stream流:
List<Emp> emps = new ArrayList<>(); emps.add(new Emp("00101","張七")); //filter()定義方法,toList()輸出為list List<Emp> emp=emps.stream().filter(e -> "張三".equals(e.getName())).collect(Collectors.toList()); emp.forEach(System.out::println);
輸出結果為:
補充知識:java中for、foreach、stream效能比較
我們在開發中迴圈遍歷一個數組經常會用到,jdk8推出了一些新特性,對迴圈做了比較,通過程式碼親測,記錄一下!
1、for迴圈
public static void main(String[] args) { Long startTime = System.currentTimeMillis(); formMethod(); Long endTime = System.currentTimeMillis(); System.out.println("result:" + (endTime - startTime)); } public static void formMethod(){ for (int i = 0; i < 10000; i++) { System.out.println("start::::::::::::"); } }
2、foreach迴圈(for迴圈的增強版)
public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 10000; i++) { list.add(i); } Long startTime = System.currentTimeMillis(); foreachMethod(list); Long endTime = System.currentTimeMillis(); System.out.println("result:" + (endTime - startTime)); } /** * foreach * @param list */ public static void foreachMethod(List<Integer> list){ list.forEach(i ->{ System.out.println("++++++++++++"); }); }
結論:通過程式碼測試發現在1萬以內的資料,for迴圈比foreach效率要高一些;但是10萬以內資料的時候,foreach效率更高一些!
foreach [10萬資料時間 1112 1165 1203 1115] [1萬資料 235 146 176 164 175]
for迴圈 [10萬資料時間 1330 1437 1347] [1萬資料 110 109 141]
3、stream api
(1)、序列處理,即同步處理
public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 10000; i++) { list.add(i); } Long startTime = System.currentTimeMillis(); streamMethod(list); Long endTime = System.currentTimeMillis(); System.out.println("result:" + (endTime - startTime)); } /** * stream 序列處理 * @param list */ public static void streamMethod(List<Integer> list){ list.stream().forEach(i ->{ System.out.println("========"); }); }
結論:1萬以內的資料,for迴圈的效能要高於foreach和stream;10萬以內的資料明顯可以看出stream效率最高,其次foreach,最後是for。
[10萬資料時間 854 892 789 844][1萬資料 172 156 219 172 171]
(2)並行處理,即stream api提供了非同步處理機制
public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < 10000; i++) { list.add(i); } Long startTime = System.currentTimeMillis(); parallelStreamMethod(list); Long endTime = System.currentTimeMillis(); System.out.println("result:" + (endTime - startTime)); } /** * stream 並行處理 * @param list */ public static void parallelStreamMethod(List<Integer> list){ list.parallelStream().forEach(i ->{ System.out.println("========"); }); }
結論:1萬以內的資料,for迴圈的效能要高於foreach和stream;10萬以內的資料明顯可以看出stream效率最高,其次foreach,最後是for。
[10萬資料時間 893 844 914 972][1萬資料 219 203 234 188 ]
最終總結:如果資料在1萬以內的話,for迴圈效率高於foreach和stream;如果資料量在10萬的時候,stream效率最高,其次是foreach,最後是for。另外需要注意的是如果資料達到100萬的話,parallelStream非同步並行處理效率最高,高於foreach和for。
以上這篇Java8之Stream流代替For迴圈操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。