Sto facendo un gioco e ho un ConcurrentHashMap che contiene tutti i giocatori attualmente loggati. Ho una sequenza AutoSaver che scorre attraverso HashMap e salva tutto il giocatore 1 per 1. Quando non ci sono molti giocatori questo va bene in quanto non ci vuole troppo tempo per iterare ma può rallentare un po 'quando ci sono molti giocatori loggati. Ho letto usando java stream e parallel, possiamo accelerare l'elaborazione delle raccolte, quindi ho provato a modificare il mio ciclo esistente per utilizzare ora lo streaming e parallelo.Cambiare il ciclo foreach esistente su ConcurrentHashMap per utilizzare Lambda per sfruttare l'elaborazione parallela
La mia domanda è, la mia implementazione è corretta? C'è un modo migliore per farlo? È sicuro il thread ora?
Ecco l'attuale implementazione
for(Player player : ActiveConnections.getAllConnectedPlayers().values(){
if(player != null)
saveManager.savePlayer(player, true);
}
Qui è la mia implementazione utilizzando flusso e parallela
ActiveConnections.getAllConnectedPlayers().values()
.stream()
.parallel()
.filter((x) -> x != null)
.forEach((x) -> saveManager.savePlayer(x, true));
EDIT Ecco il mio risparmio implementazione direttore
public class SaveManager {
private MySqlManager sqlManager;
public SaveManager(){
sqlManager = MySqlManager.getInstance();
}
public void savePlayer(Player player, boolean autoSave){
//Saves the player
}
A guadagno Ho appena iniziato a usare lambda quindi per favore fatemi sapere se c'è qualcosa di sbagliato.
Questo sembra giusto per me ... Questa domanda potrebbe essere più adatta a [Code Review] (http://codereview.stackexchange.com/), però. –
Non avevo idea che ci fosse qualcosa come la revisione del codice sullo stack overflow. :) Lo sposterò se è necessario. – Sneh
La documentazione di 'ConcurrentHashMap' afferma chiaramente che" [...] Come Hashtable ma a differenza di HashMap, questa classe non consente l'utilizzo di null come chiave o valore. "- quindi perché il test per null? – fge