2014-10-02 13 views
11

Ho un Set<String> usernames e List<Player> playersJava 8 Lambda - filtro di raccolta da un'altra collezione

vorrei filtrare quei giocatori che non sono nel set.

so come fare questo in Vanilla pre Java 8

List<Player> distinctPlayers = new ArrayList<Player>(); 

for(Player p : players) { 
    if(!usernames.contains(p.getUsername()) distinctPlayers.add(p); 
} 

Sto cercando di scrivere questo semplice codice con un'espressione lambda, ma sto lottando per ottenere usernames.contains() a lavorare in un filtro

players.stream().filter(!usernames.contains(p -> p.getUsername())) 
.collect(Collectors.toList()); 

Questo non può essere compilato. "Impossibile resove metodo getUsername()"

risposta

24

Hai l'espressione lambda nel posto sbagliato - l'intero argomento filter dovrebbe essere l'espressione lambda. In altre parole, "Dato un giocatore p, dovrei filtrare o no?"

players.stream().filter(p -> !usernames.contains(p.getUsername())) 
+2

Bullocks! Sapevo che c'era qualcosa di semplice che mi mancava. Grazie! #feelsAshamed –

+0

Bello! ! Grazie ~ –

+0

Ciao, io sto usando scenario esata ma, mostra errore di compilazione nomi utente "variabile locale '' definiti in un ambito di inclusione deve essere definitiva o effettivamente finale" –