Java8利用stream對集合的複雜操作(順序處理,並行處理)
阿新 • • 發佈:2019-01-08
又是一個很平常的週六,習慣性地來到公司,中午看了會Java8實戰,發現其中講到Stream實現集合的複雜操作,於是自己動手寫了個Demo,並測試了下效率。
結果是並行處理的效率遠遠高於順序處理。可能與我在公司用的電腦有關(我用的是8核)。
話不多說,直接放程式碼:
package xie.test.stream; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class StreamTest { private static List<Player> players = new ArrayList<>(); static void initPlayers(){ Player player1 = new Player("Jerry", 1, 250.0); Player player2 = new Player("Lucy", 0, 365.0); Player player3 = new Player("Herry", 0, 222.0); Player player4 = new Player("Jack", 1, 11.0); Player player5 = new Player("Ham", 1, 2.0); Player player6 = new Player("Dem", 1, 21.0); Player player7 = new Player("Roce", 0, 122.0); Player player8 = new Player("Back", 1, 182.0); players.add(player1); players.add(player2); players.add(player3); players.add(player4); players.add(player5); players.add(player6); players.add(player7); players.add(player8); } /** * 利用parallelStream篩選餘額大於20的玩家,並根據性別進行分組(並行處理) * @param players * @return */ static Map<Integer,List<Player>> parallelStreamSort(List<Player> players){ return players.parallelStream().filter((Player p) -> p.getMoney() > 20).collect(Collectors.groupingBy(Player::getSex)); } /** * 利用stream篩選餘額大於20的玩家,並根據性別進行分組(順序處理) * @param players * @return */ static Map<Integer,List<Player>> streamSort(List<Player> players){ return players.stream().filter((Player p) -> p.getMoney() > 20).collect(Collectors.groupingBy(Player::getSex)); } public static void main(String[] args) { initPlayers(); long time = System.currentTimeMillis(); System.out.println(streamSort(players)); System.out.println("順序處理時間:"+(System.currentTimeMillis() - time)); long time1 = System.currentTimeMillis(); System.out.println(parallelStreamSort(players)); System.out.println("並行處理時間:"+(System.currentTimeMillis() - time1)); } }
該用例中,集合中只有8個元素,但通過多次執行結果顯示,並行處理時間多次能達到0,少數為16毫秒,即秒過,而順序處理的時間穩定在63毫秒左右。
按理想狀態來說,並行處理效率應為順序處理的8倍(前面提到我的電腦為8核CPU),即執行時間的1/8,但由於資料量少的原因,無法測出穩定性,於是,我把資料量增加到1000W,繼續測試。
此時發現結果出現了驚天大逆轉,順序處理的效率遠遠超過了並行處理,大概為其五倍左右。
為什麼會出現這種情況呢,我也很鬱悶,我也是個新手啊,哥哥。然後我發現我的案例中是單執行緒的環境,誒,好像發現問題了。parallelStream是並行處理,在多執行緒的環境下可能會更好,但也只是猜想。
希望各位大佬看到這種問題能把正確的使用方式告訴我下呢!