Java並行流_parallelStream的使用方式


  最近在同事的代碼里,發現了->的代碼,覺得有點驚訝和疑惑,雖然知道->{}是匿名函數的表達式,但卻被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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM