最近在同事的代碼里,發現了->的代碼,覺得有點驚訝和疑惑,雖然知道->{}是匿名函數的表達式,但卻被parallelStream所吸引。
就像這樣的代碼:
List<Bom> specialModelNeedToBeSaved = bom.parallelStream() .filter(a->CodeStartWithList.getStartWithListOfModel().contains(a.getScpe().substring(0,2))) .filter(b->"(".equals(b.getScpe().substring(3,4))||"(".equals(b.getScpe().substring(3,4))) .collect(Collectors.toList());
看着挺長挺nb的,百度了才知道parallelStream是一個叫並行流的東西,Java1.8才加入的。它通過默認的ForkJoinPool,提高多線程任務的速度,默認線程數量等於運行計算機上的處理器數量。Java8為ForkJoinPool添加了一個通用線程池,這個線程池用來處理那些沒有被顯式提交到任何線程池的任務。當調用Arrays類上添加的新方法時,自動並行化就會發生。
注意哦,這里是並行,不是並發。因為是多個處理器同時處理,和並發還是有區別的。
我們可以用parallelStream來處理list里的元素,比如輸出:
TestTwo testTwo = new TestTwo(); List<Integer> list = new ArrayList<>(); for(int i=1;i<100;i++) list.add(i); list.parallelStream().forEach(a->{ out.println(a); });
這樣輸出是無序,當然我們也可以讓它有序的!forEachOrdered就是按照list的順序依次執行。
list.parallelStream().forEachOrdered(a->{
out.println(a);
});
我們也可以通過fiter來過濾list里的值,需要注意的是后面的匿名函數需要有true,false返回值,以此才能知道,哪些元素是需要被過濾的。
List<Integer> p2 = list.parallelStream().filter(a->{ if(a>95){ return true; }else{ return false; } }).collect(Collectors.toList()); p2.parallelStream().forEachOrdered(a->{ out.println(a); }); 輸出: 96 97 98 99