1. 程式人生 > >Java8利用stream對集合的複雜操作(順序處理,並行處理)

Java8利用stream對集合的複雜操作(順序處理,並行處理)

又是一個很平常的週六,習慣性地來到公司,中午看了會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是並行處理,在多執行緒的環境下可能會更好,但也只是猜想。

希望各位大佬看到這種問題能把正確的使用方式告訴我下呢!